有关我的系统的详细信息:我在 Oracle Virtual Box 4.3.6 上运行 Ubuntu 12.04.4 LTS,在华硕笔记本电脑上安装 Windows 8.1。我使用的是 bash_completion 版本 1.3(我从 /etc/bash_completion 文件的注释中得到这个信息)
我以为 bash 总是会在命令后自动完成文件和目录。但在谷歌搜索并阅读了有关 bash_completion 的更多信息后,我意识到不同的命令是不同的。但是当我使用另一种方式调用时,我遇到了 bash 自动完成功能的问题emacs -nw
。
我已ee
在文件中将其定义为函数~/.bash_aliases
。我知道这不是别名,但我只是使用函数来执行别名会执行的操作:
function ee () {
emacs -nw "$@"
}
export -f ee
我认为tab
如果我输入部分文件名,我仍然可以使用 ee 函数完成功能。但这似乎不起作用。而如果我输入emacs -nw
后跟部分文件名,制表符完成功能就可以完美运行。我真的不明白这里缺少什么。我检查了命令的输出,得到了和的complete -p
以下结果:emacs
ee
eakangk@eakan-u-vbox:~$ complete -p | grep 'ee'
complete -F _filedir_xspec ee
eakangk@eakan-u-vbox:~$ complete -p | grep 'emacs'
complete -F _filedir_xspec emacs
这是否意味着在尝试自动完成时,这两个命令应该给我相同的行为?编辑:发布问题时,我没有ee
在/etc/bash_completion
文件中看到该行。但现在我知道它在那里。但 /etc/bash_completion 文件有以下几行:
complete -f -X '!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)' ee
complete -f -X '*.@(o|so|so.!(conf)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite
我在这里做错了什么?
答案1
这与bash 完成包。它为 emacs 设置了一些自定义的完成功能,显然当命令名称不同时,相同的完成功能会失败。
我自己不使用 bash-completion,但我快速浏览了源代码,发现了这一点:
_install_xspec '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite
这可能表示“对于这些命令,不要完成以 .gif、.mp3、.avi 等结尾的文件”,我猜测如果您的 ee 命令没有 _install_xspec 行,它就不会完成任何事情。
查看 _install_xspec 函数,它只是将这些值放在一个_xspecs
使用命令名作为键的关联数组中,因此如果您运行,_xspecs[ee]=${_xspecs[emacs]}
ee 命令应该获得与 emacs 相同的完成。