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