Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          [Tips] DIY制表符鍵自動補全(bash)

          Posted on 2009-06-01 00:11 laogao 閱讀(4091) 評論(1)  編輯  收藏 所屬分類: Computer UsageGNU/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!

          Feedback

          # re: [Tips] DIY制表符鍵自動補全(bash)  回復  更多評論   

          2009-09-29 18:48 by http://bbs2.chinaunix.net/thread-1587745-1-1.html
          博主,請問這是你原創的嗎?
          我想要實現這一個功能,請問怎么辦?
          http://bbs2.chinaunix.net/thread-1587745-1-1.html
          主站蜘蛛池模板: 淮北市| 株洲县| 崇州市| 家居| 北川| 江达县| 江西省| 灌阳县| 崇州市| 锦屏县| 长治市| 朝阳区| 运城市| 平泉县| 武义县| 青岛市| 麻城市| 当涂县| 库伦旗| 兴城市| 迁安市| 威宁| 印江| 井研县| 汤原县| 临潭县| 合川市| 海兴县| 阳江市| 瓦房店市| 洛隆县| 商都县| 万安县| 盐山县| 崇阳县| 岑溪市| 正安县| 延川县| 财经| 清水河县| 油尖旺区|