Posted on 2009-06-01 00:11
laogao 閱讀(4087)
評論(1) 編輯 收藏 所屬分類:
Computer Usage 、
GNU/Linux
各位童鞋們過節好啊,今天給大家帶來的是在bash中DIY制表符鍵自動補全。
bash是大多數主流Linux發行版的默認shell,如果你用過bash,那么一定會接觸到<tab>鍵自動補全的這個方便的功能,當你一個命令的頭幾個字符敲下去,按下<tab>,如果以此開頭的命令只有1個, bash會直接幫你補全,如果有多個,則會有相應提示,而在后續的參數輸入時,也會帶有默認的自動補全文件路徑的功能。當你習慣了<tab>,很難想象沒有自動補全的日子會是什么樣子。
bash默認支持常見的補全功能,如可執行命令、文件路徑等,如果安裝了bash-completion包,甚至連chown, man, svn, ssh這些也會帶有相應的自動補全提示,而不是單純的文件路徑補全。好奇的你一定想知道是怎么實現的吧,其實很簡單,我們舉個例子來說:
假定你有一個命令,叫做abc,它又有自己的子命令,分別是build_all、compile和update,其中compile這個子命令需要的參數必須來自project.list這個文件中列出的值,怎么實現<tab>自動補全,讓bash知道abc的合法子命令和compile子命令的合法參數列表呢?
在你的~/.bashrc或者任何一個啟動bash時會被執行的文件中加入下面的代碼:
function _abc() {
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]};
local com=${COMP_WORDS[COMP_CWORD-1]};
case $com in
'abc')
COMPREPLY=($(compgen -W 'build_all compile update' -- $cur))
;;
'compile')
local pro=($(awk '{print $1}' project.list))
COMPREPLY=($(compgen -W '${pro[@]}' -- $cur))
;;
*)
;;
esac
return 0
}
complete -F _abc abc
手動載入一下,或者重啟bash,再敲abc命令,即可自動補全子命令,如果子命令是compile,還能自動補全相應的參數值。我們來簡單分析一下這段代碼。首先我們定義一個function _abc,這個函數先清空自動補全列表,根據當前輸入位置前一個token判斷目前需要自動補全的語境,如果是abc,則將自動補全內容設置為'build_all'、'compile'和'update',如果是'compile',則將project.list文件內容輸出到補全列表,當然,這里我們也可以換成其他任何必要的方式。最后我們通過complete -F _abc abc將這段自動補全邏輯注冊到abc這個主詞上。這樣當我們敲abc時,后續內容就能自動補全了。
Enjoy!