当我为 emacs 创建函数时,bash 自动完成功能不起作用

当我为 emacs 创建函数时,bash 自动完成功能不起作用

有关我的系统的详细信息:我在 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以下结果:emacsee

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 相同的完成。

相关内容