
自從製表符補全成為 shell 中的標準功能以來,我一直是它的一個非常滿意的使用者。我甚至喜歡 Bash 的智慧補全功能(如果我輸入 evince foo<TAB>,它只搜尋 PDF 文件)——只要它猜對了。
當 Bash 使用其智慧完成來拒絕完成時,這會毀掉原本快樂的一天。
今天我想要:
tar xvf centos5.8_x86_1.ova
所以我輸入:
tar xvf cent<TAB>
Bash 拒絕完成路徑,因為 .ova-files 不是您通常在 tar 中使用的檔案。
我知道我可以卸載 bash-completion 套件來刪除智慧完成。但我能魚與熊掌兼得嗎?
我可以要求 bash 首先使用智慧補全,如果失敗,然後使用非智慧補全嗎?
答案1
在程式 tar、vim 和 emacs 的所有「智慧」完成都失敗後,以下命令應開啟正常的 bash 完成:
compopt -o bashdefault tar vim emacs
另請參閱相關頁面在線上 bash 手冊中。
注意:您會得到由手頭命令的智能完成定義的完成類型(命令/文件名/用戶名等)的正常行為,例如,即使您調用 ,完成service
也不會完成文件名complete -o bashdefault service
。
在這種情況以及其他智慧型自動完成失敗的情況下,您可以隨時按下Alt-/
(或M-/
在 bash 手冊的符號中)來完成檔案名稱幾乎與禁用智慧完成時 TAB 的工作方式相同(在M-/
不完成類似模式的意義上幾乎相同的方式*.txt
)。看這裡用於其他類型完成的按鍵序列,例如命令和使用者名稱。
答案2
奧萊先生:-),
魚與熊掌兼得:
<tab>
將為您提供 bash 在完成時的最佳猜測。如您所知,有時這是錯誤的。
然而,當 bash 的補全不完美時, M-/
( ALT
+ SHIFT
+ 7
(在我們的丹麥鍵盤上是左ALT
,而不是右AltGr
))將強制補全作為文件。因此,M-/
當我知道我想強製完成作為文件時,我會使用它。
對我來說,這是兩全其美的。
答案3
bash 完成是 bash 標準完成的擴展,它本身就是一個 bash 程式。因此,如果您想更改程式的行為方式,只需更改它即可。這是免費軟體,您可以自由使用。對於該命令的特定情況tar
,該文件是/usr/share/bash-completion/completions/tar
.要tar
自動完成副檔名為 的文件ova
,只需將其新增至該行
local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'
所以它說
local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'
請注意,這是 Debian Wheezy(目前穩定版本)的路徑和現有程式碼。不同的發行版或版本可能有不同的程式碼,但想法是相同的。打開程式碼並調整它以執行您希望它執行的操作。
編輯:我剛剛注意到問題是關於每次它找不到匹配項而不僅僅是添加到 的具體ova
情況tar
。也許它對某人仍然有用,知道他們可以在哪裡尋找來源。