帶有通配符的 Bash 自動完成

帶有通配符的 Bash 自動完成

我想像在 emacs 中一樣在終端機中輸入:

emacs 2019-*subject*

當我擊中時,Tab我得到第一場比賽:

2019-08-03-subject.markdown 

我想要的是它向我展示以下選項:

2019-08-03-subject.markdown 2019-bla-bla-subject-predicate.markdown etc...

我在網上到處查看,不敢相信這不是一個功能。

許多 相似的提出的問題。答案並不像我想要的(如上圖)。我嘗試過的其他解決方案:這裡

PS 我使用 Ubuntu 16。那就非常方便了。

答案1

之後發生的事情Tab取決於完成腳本。這個答案讓我相信 2013 年至少有一個用戶期望的行為是存在的,但在 2019 年我的 Debian 9 中的行為就像你所描述的那樣;從那時起,腳本/行為可能已經改變。

此外,Bash 根據輸入的命令(目前行的第一個單字)選擇腳本。任何單一的更改都會影響所有完成以提供您想要的內容,這並不是立即顯而易見的(我想該_filedir功能是一個好的開始)。


幸運的是,您可以根據需要進行可能的擴展。來自man 1 bashREADLINE標題下):

glob-complete-word( M-g)
point 之前的單字被視為路徑名擴展的模式,並隱式附加一個星號。此模式用於產生可能完成的匹配檔名清單。

glob-expand-word( C-x *)
point 之前的單字被視為路徑名擴展的模式,並插入符合檔案名稱的列表,替換該單字。如果提供數字參數,則在路徑名擴展之前附加一個星號。

glob-list-expansions( C-x g)顯示
由 產生的擴展列表glob-expand-word,並重新繪製線條。如果提供數字參數,則在路徑名擴展之前附加一個星號。

M-gC-x *C-x g描述預設鍵綁定。更友善的格式是:

  • Meta+ g( Alt+ g) 為glob-complete-word,
  • Ctrl+ x, (release Ctrl) *for glob-expand-word(注意:*實際上是我鍵盤上的Shift+ 8),
  • Ctrl+ x, (釋放Ctrl)gglob-list-expansions.

以下程式碼設定這些綁定(以防它們因某種原因丟失):

  • 僅適用於目前 shell:

    # commands to run in Bash
    bind '"\eg":   glob-complete-word'
    bind '"\C-x*": glob-expand-word'
    bind '"\C-xg": glob-list-expansions'
    
  • 或在您的永久配置中(/etc/inputrc~/.inputrc):

    # lines to add
    "\eg":   glob-complete-word
    "\C-x*": glob-expand-word
    "\C-xg": glob-list-expansions
    

    (注意這只會影響新的 shell,除非你重新載入)。


您將會對glob-complete-word或感興趣glob-list-expansions。主要區別:

  • glob-complete-word總是附加一個星號,而glob-list-expansions這是有條件的(請參閱引用的手冊)。
  • 如果有很多匹配項,那麼您可能需要觸發glob-complete-word兩次(即按組合鍵兩次)才能列印某些內容;這取決於show-all-if-ambiguous,比較已經提到的答案
  • 如果只有一場比賽,那麼glob-complete-word將執行實際的行完成,同時glob-list-expansions仍然只顯示比賽。

根據您的具體情況,輸入:

emacs 2019-*subject*

然後Ctrl+ x, g.

相關內容