Bash

為什麼完成不適用於所有別名?

  • August 14, 2018

在我的.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 

foremxem它們都有效(也ev有效),但是當我嘗試使用gvorv時,它不會 -

:~/$ 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你有兩種方法來處理這個:

  1. gv為不同的函式設置別名完成。例如,_longopt適用於您的情況:
complete -F _longopt gv
  1. 編寫一個通用別名完成函式並在gv. 幸運的是有人為你做了這個:https ://github.com/cykerway/complete-alias

引用自:https://unix.stackexchange.com/questions/164645