Bash
為什麼完成不適用於所有別名?
在我的
.bash_aliases
文件中,我有幾個別名,比如——shopt -s expand_aliases alias emx='emacs' alias em='emacs -nw' alias gv='gvim' alias v='vi' alias ev='evince'
當我使用它們並按下
$$ tab $$對於自動完成,他們工作 -
:~/$ emx main-0 [press tab] main-04.cpp main-05.cpp main-06.cpp main-06-test.cpp
或者
:~/$ em main-0 [press tab] main-04.cpp main-05.cpp main-06.cpp main-06-test.cpp
for
emx
和em
它們都有效(也ev
有效),但是當我嘗試使用gv
orv
時,它不會 -:~/$ gv main-0 [press tab] <nothing happens>
為什麼 ??
如果這是一個混淆點,
expand_aliases
確定在處理命令時是否檢查別名,這與completion完全不同。聽起來您已經設置了按命令完成,請檢查
complete
(無參數)的輸出。gv
通常是ghostview命令,因此gv
完成可能只是搜尋 PS/EPS/PDF 文件。
首先,Bash 自動補全只是讀取你在命令行中輸入的內容而不解析別名。如果您輸入命令名稱,則它會讀取命令名稱。如果您輸入別名,則它會讀取別名。因此,就完成而言,與您的情況
gv
無關。gvim
實際上,是在bash-completion腳本中gv
定義的名稱為:_install_xspec '!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))' gv ggv kghostview complete -F _filedir_xspec gv
所以基本上它只匹配未壓縮和壓縮的 ps 和 pdf 文件。
AFAIK你有兩種方法來處理這個:
gv
為不同的函式設置別名完成。例如,_longopt
適用於您的情況:complete -F _longopt gv
- 編寫一個通用別名完成函式並在
gv
. 幸運的是有人為你做了這個:https ://github.com/cykerway/complete-alias