Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4
          各位童鞋們過節(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!

          Feedback

          # re: [Tips] DIY制表符鍵自動(dòng)補(bǔ)全(bash)  回復(fù)  更多評(píng)論   

          2009-09-29 18:48 by http://bbs2.chinaunix.net/thread-1587745-1-1.html
          博主,請(qǐng)問這是你原創(chuàng)的嗎?
          我想要實(shí)現(xiàn)這一個(gè)功能,請(qǐng)問怎么辦?
          http://bbs2.chinaunix.net/thread-1587745-1-1.html
          主站蜘蛛池模板: 同德县| 宁城县| 渝中区| 湖南省| 牡丹江市| 绍兴市| 永川市| 蛟河市| 荥阳市| 宕昌县| 右玉县| 明光市| 方城县| 色达县| 若羌县| 水富县| 儋州市| 小金县| 宜宾市| 平远县| 兴化市| 甘泉县| 长垣县| 盘山县| 景东| 都江堰市| 宁津县| 扬州市| 崇左市| 宝清县| 邮箱| 鄢陵县| 东光县| 慈利县| 扎囊县| 阜宁县| 宝丰县| 新蔡县| 东兰县| 麻城市| 江永县|