vern@2012-12-16:/usr% ls tags
zsh and shell

关于 zsh 自动补全系统

习惯了 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...
1. completion  
  用于补全系统的保留字、关键字
2. func  
  Name of directly called widget, blank for contextual completion
3. completer  
  Method of completion e.g. complete; see below
4. cmd  
  某条补全规则是针对那些个命令的(`ssh`命令、`user*`命令等)
5. arg  
  Only valid with standard parsing: arg-n for nth argument
  option-opt-n for nth argument of option opt
6. tag  
  某条补全规则的补全类型(命令的参数、用户名、邮箱等等丰富的类型)

自定义可用于 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"'