习惯了 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___
    
    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
      某条补全规则的补全类型(命令的参数、用户名、邮箱等等丰富的类型)
  • 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"'