在我的.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
对于emx
和em
它们都有效(也ev
有效),但是当我尝试使用gv
or时v
,它不起作用 -
:~/$ gv main-0 [press tab]
<nothing happens>
为什么 ??
答案1
如果这是一个混淆点,expand_aliases
确定在处理命令时是否检查别名,则完全是另一回事完成。
听起来您已经设置了每个命令的完成,请检查complete
(无参数)的输出。gv
按照惯例是幻景命令,因此完成可能gv
只是搜索 PS/EPS/PDF 文件。
答案2
首先,Bash 自动完成功能只是读取您在命令行中输入的内容,而不解析别名。如果输入命令名称,则它会读取命令名称。如果您输入别名,那么它会读取别名。因此,就完成而言,与您的情况gv
无关。gvim
事实上,gv
是一个定义在bash 完成脚本为:
_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