习惯了 VIM 的 neocomplcache 插件,寻思着这么霸气的功能,要是 ZSH 也有就好了,结果还真有。精简版和升级版。
ZSH 的牛逼不是吹的,不信你看:
[ -f ~/.ssh/config ] && : ${(A)ssh_config_hosts:=${${${${(@M)${(f)"$(<~/.ssh/config)"}:#Host *}#Host }:#*\**}:#*\?*}}
这 A
,这圈M
,这小 f
,特别是这傻逼冒号加井号再他么空格还带个星号,还不结束,他妈的还有大括号,还有那么多星星,搞毛啊搞,有完没完啊,神马鸟玩意啊啊啊啊。
麻痹的,看了 Zsh Reference Card 以后好不容易才缓过来。恩,还是有不少收获的。最后它讲到了补全系统,我对照自己的配置,发现以前抄来的写法,有很多都是不标准的。
自定义一条补全规则的写法是:
zstyle context style value...
-
标准的 context 形式(第二行是示意):
:completion:func:completer:cmd:arg:tag # 1__________2____3_________4___5___6___
- completion
用于补全系统的保留字、关键字 - func
Name of directly called widget, blank for contextual completion - completer
Method of completion e.g. complete; see below - cmd
某条补全规则是针对那些个命令的(ssh
命令、user*
命令等) - arg
Only valid with standard parsing: arg-n for nth argument
option-opt-n for nth argument of option opt - tag
某条补全规则的补全类型(命令的参数、用户名、邮箱等等丰富的类型)
- completion
-
style 是表示某条规则一旦匹配后补全系统的行为
-
有些 style 的行为是需要赋值的,value 就是这个值
自定义可用于 kill
命令的补全规则,标准的写法,当然是 6 个冒号了:
zstyle ':completion:*:*:*:*:processes' command 'ps --forest -au$USER -o pid,time,cmd|grep -v "ps -au$USER -o pid,time,cmd"'
虽然下面这样的写法也能起效果,但是少了三个冒号。完全反人类,抵制之:
zstyle ':completion:*:processes' command 'ps --forest -au$USER -o pid,time,cmd|grep -v "ps -au$USER -o pid,time,cmd"'