自定义补全bash complete

来源:互联网 发布:天下全與总图 知乎 编辑:程序博客网 时间:2024/05/16 12:34

最开始接触shell时觉得命令自动补全功能很强大,但没有深入,今因偶然机遇重新学习竟然看懂了,故记之以作后查。

国外也有英文帖子作例解,但解释更长而且也是个人思路讲解,也不一定有助于自己的理解。

英文水平好的可以直接看bash mannual中Progammable Completion这段即可,耦即是耐着性子看懂了这段英文手册才有了收获。

故这里主要是参照手册来解释,也几乎是翻译了,敬请谅解。

需要注意的是complete仅对identified的name作补全,此name由非数字开头的字母数字下划线组成。

自定义补全时调用complete命令来完成,complete通过选项提供了多种补全的途径和方式,这些选项是按照先后次序起作用的:-A -G -W -F -C -X -P -S -o。

调用complete之后,即定义了compspec,大概可以翻译为补全规范。之后每当按tab键(或其它触发补全的按键序列)时会触发补全机制,即bash根据此compspec来生成候选的补全单词的。可以先来看下complete大概的工作机制和选项定义:

-D:指定后面选项(如-A/-G/-W等)定义的compspec作为默认compspec

-E:指定当命令行为空时的compspec

-A:action,指定动作,这个有固定的几个可选,如alias, arrayvar, buildtin, command等, 在指定动作中找核匹配单词。如果当前正在匹配的单词正好是候选单词的前缀,则返回这些匹配单词。如果有同时指定了-f和-d选项,则shell变量FIGNORE会再过滤(filter-out)这些匹配单词。

-G:globpat,shell glob pattern模式匹配。

-W:wordlist,指定单词列表,workdlist由IFS变量指定的字符作为分割符进行分割。每个单词再进行shell扩展,其结果再进行shell "Word Splitting"规则。最终结果还是要进行prefix匹配。

-F:function, 指定function生成可选单词。在函数定义中,一些shell变量生效可以使用:COMP_LINE, COMP_POINT, COMP_KEY, COMP_TYPE。函数参数定义是:$1为当前要补全参数的命令,$2为当前要补全的单词,$3为当前要补全单词的前面一个单词。这些都可以在自定义函数中使用。最终单词列表要放到COMPREPLY这个数组中,shell补全机制是从这个数组中取单词的。

-C:command,由命令生成可选单词。

-X:filter,指定过滤(filterout)pattern,此pattern为路径名扩展所使用的pattern规则。如果此pattern前面为感叹号(!),则移除不符合此pattern的单词。

-P:prefix

-S:suffix

prefix和suffix分别加在每个可选单词的前面和后面。

最后-o选项提供修正上面所定义的compspec的行为。如果指定-o dirnames时且action匹配为空则生成目录名匹配,而-o plusdirnames则在action匹配不论是否为空时都追加目录名匹配。

当然shell手册上有更完整的compspec生成规则描述,但一般我们只用上面的基本上可以满足我们的要求。选项-F指定的function和-C指定的command可以自由的定义compspec,生成所期望的匹配单词列表。

一般我们使用complete -D -F function name这个最简单的形式可以足够了,name是要使用补全机制的命令名或上面所说的identified的name.


下面举例说明:一般做新项目时,总会需要拉代码,之后可能需要准备编译环境定义,最后项目结束或认为本地比较dirty需要重新拉代码,则delete本地目录下所有内容。

这些事情有时候比较繁琐且有时需要重新拉旧项目而翻看记录查看之前的步骤比较麻烦,所以定义了一个kickoff函数用于做些事情。

kickoff第一个参数为项目名称或action(如删除本地代码),第二个参数为prepare用于准备编译环境等。



上面有些代码替换为自己想要的命令即可,以后有时间再整理成可直接跑的例子,sry.


0 0
原创粉丝点击