简介
项目路径
- https://github.com/scop/bash-completion/
本文描述的内容可能因为
bash版本差异, 执行会有细微差异;
什么是补全
补全规则
补全规则选择
补全规则生成候选项
生成集合: 根据拼写一截的补全; 比如
git sta就有补全stage stash status;根据sta过滤;-f -d生成集合会被FIGNORE过滤;比如
-G "*.sh", 这个就是文件扩张生成当前目录下sh结尾的文件; 不会被sta这种影响, 会全部纳入; 但是受到FIGNORE的影响;
-W "hello world $PATH", 进行bash的扩张后生成的字符串, 再进行bash分词规则生成字符串集合;git sta会从过滤集合中过滤前缀sta的集合;-W某些场景完全可以替代; 差距就是是否需要对集合过滤;
-F -C: 会生成变量;COMP_LINE, COMP_POINT, COMP_KEY, COMP_TYPE;-F还会生成COMP_WORDS, COMP_CWORD; 入参:$1指令名,$2补全名, 如sta;$3不全名前一个单词, 比如git sta,sta前一个就是git; 无过滤规则; 即生成的所有都纳入候选, 需指令提供者或函数提供者根据输入参数进行过滤;
-F优先: 是shell函数; 可以通过compgen -A function查看当前环境下的函数定义; 当然一般是局部自定义的;-F指定的function一般结合compgen, comopt使用; 返回集合通过COMREPLY数组, 即一般使用COMPREPLY=( hello world );
-C次之: 基本和-F相同, 除了没有COMP_WORDS, COMP_CWORD; 输出到标准输出的字符集按\n进行分词, 生成结果集; 可以结合\使用;过滤规则:
&被替代为sta; 可以用\&保持愿意;!则是取反;shopt nocasematch可以按照不区分大小写匹配;complete -G "*" -X "!&*" todo; 完全匹配的会被删除; 保留不匹配的;补充
-o选项;
- 如果前面没有任何匹配集合, 且规则指定了
-o dirnames; 会将当前目录下的文件夹名纳入匹配, 并过滤; 但是如果有匹配集合这个选项就不会生效;- 指定了
-o plusdirs; 会将目录纳入集合; 和-o dirnames区别在于,-o plusdirs一定会生效;complete -W "hello" -o plusdirs todo;如果上面的
complete指定的规则;bash completion,Readline的补齐规则会被禁用; 可以通过-o bashdefault开启bash complettion,-o default开启Readline completion作为补充手段, 这个是没有任何生成集合的时候才会生效, 有就不会生效;如果有
compspec是目录, 会补全/; 可以通过一些手段规避;complete -W "hello $(find . -maxdepth 1 -mindepth 1 -type d -printf "%f\n")" todo;compgen -d生成的也没有后缀;补充: 动态加载规则
- 一般都是一次性的加载; 但是当我们
-F的返回值是124的时候, 会重新加载当前指令的complete; 即返回124表示当前指令的规则发生了变化;_completion_loader() { . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124 } complete -D -F _completion_loader -o bashdefault -o default
- 默认规则, 用于动态生成某个指令的规则; 即使用了指令并触发才生成;
指令: compgen, complete, compopt
compgen格式:
compgen [option] [word]
- 这个是手动触发; 即模拟
complete;option是可以是complete的所有选项, 除了-r, -p;-F -C在这里也不太好用; 因为相关参数没有设置;word用于过滤; 即git sta案例; 可以理解为sta就是这里的word参与过滤; 没有就不过滤; 返回所有;- 具体使用参见后面案例
compopt格式:
compopt [-o option] [-DEI] [+o option] [name], 即控制某个指令的选项开关; 不修改其他规则;
-o option: 打开某个选项;+o option: 关闭某个选项;name: 指定具体指令, 未指定表示当前指令;[-DEI]: 指定是name忽略;
completecomplete [-abcdefgjksuv] [-o comp-option] [-DEI] [-A action] [-G globpat
Bash命令行补全机制详解与实践

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



