为什么补全不适用于所有别名?

为什么补全不适用于所有别名?

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

对于emxem它们都有效(也ev有效),但是当我尝试使用gvor时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 你有两种方法来处理这个问题:

  1. 将别名完成设置为gv不同的函数。例如,_longopt适用于您的情况:

    complete -F _longopt gv
    
  2. 编写一个通用别名完成函数并在gv.幸运的是有人已经为你做到了这一点:https://github.com/cykerway/complete-alias

相关内容