
有關我的系統的詳細資訊:我在 Oracle Virtual Box 4.3.6 上運行 Ubuntu 12.04.4 LTS,來自安裝在 Asus 筆記型電腦上的 Windows 8.1。我正在使用 bash_completion 版本 1.3(我從 /etc/bash_completion 檔案的註釋中得到這一點)
我認為 bash 總是在命令之後自動完成檔案和目錄。但經過谷歌搜尋並閱讀更多有關 bash_completion 的內容後,我意識到這對於不同的命令是不同的。但是當我使用替代方式呼叫 .bashrc 時,我遇到了 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 相同的完成結果。