[关闭]
@electricface 2014-04-17T00:53:18.000000Z 字数 1294 阅读 1250

bash 补全


Bash下的补全是通过内置命令complete/compgen来实现的。

系统启动时搜索的补全脚本 /etc/bash_completion.d/

查看补全函数的方法

以可重用的格式打印现有的补全声明 complete -p

  1. 先用tab 键补全某个命令,比如 apt-get

  2. complete -p | grep apt-get 结果是 complete -F _apt_get apt-get

  3. type _apt_get 就能打印出补全函数了。


编写补全函数

根据输入从Wordlist中得到补全列表 compgen -W 'This is COMP_WORDS' -- $cur

compgen 的选项说明

complete根据内置变量生成补全列表的。写补全脚本时也要利用Bash的这些内置变量

在命令行输入的时候,${COMP_WORDS[COMP_CWORD]}表示光标处的单词, ${COMP_WORDS[COMP_CWORD-1]}表示前一些单词,补全就是根据光标所在单词的位置得到COMPREPLY

如 _ei_bin 函数,用于补全 eib 命令

  1. _ei_bin (){
  2. local cur=${COMP_WORDS[COMP_CWORD]}
  3. bin_ls=`ls $HOME_UP/bin/`
  4. COMPREPLY=( $( compgen -W "$bin_ls" -- "$cur" ) )
  5. }
  6. complete -F _ei_bin eib

再比如 _lang 函数

  1. _lang (){
  2. local cur=${COMP_WORDS[COMP_CWORD]}
  3. case $COMP_CWORD in
  4. 1)
  5. COMPREPLY=($(compgen -W 'zh_CN zh_TW zh_HK cs_CZ pt_BR en_US' -- "$cur"))
  6. return;;
  7. 2)
  8. COMPREPLY=($(compgen -f -c -- "$cur"))
  9. return;;
  10. esac
  11. }
  12. complete -F _lang lang

配置

在 .bashrc 文件中写上 bind -f "/path/of/.inputrc"

  1. #单击 tab 像vim一样的补全
  2. TAB: menu-complete
  3. # Ctrl + p 显示所有补全
  4. "\C-p": possible-completions
  5. set completion-query-items 50
  6. set completion-ignore-case on
  7. set completion-map-case on
  8. set completion-prefix-display-length 2
  9. set skip-completed-text on
  10. set menu-complete-display-prefix on

有关readline 的配置说明,详细请 man bash 然后搜索 Readline Variables

参考

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注