2016-09-19 165 views
0

我需要自动完成一个函数的两个参数,其中第二个参数取决于第一个参数。zsh自动完成,基于第一个参数的第二个参数

一个示例:函数“foo”的第一个参数可以具有值“a”或“b”。第二个参数在第一个参数是“a”的情况下可以具有值“10”或“11”,并且在第一个参数是“b”的情况下可以具有“20”和“21”。因此,以下参数组合是合法的:

foo a 10 
foo a 11 
foo b 20 
foo b 21 

这些组合是预先知道的(它们可以是硬编码的)。

zsh completion system doc是相当晦涩的,伟大的How To也没有解决我的问题。最接近的将是使用_arguments,可能与国家行为,但我没有设法使其工作。

回答

1

_arguments如果您将选项与您所描述的参数混合在一起,将会有意义。否则,只是看的$words阵列前面的字 - 是这样的:

if ((CURRENT == 1)); then 
    _wanted letters expl letter compadd a b 
else 
    case $words[1] in 
    a) numbers=(10 11) ;; 
    b) numbers=(20 21) ;; 
    esac 
    _wanted numbers expl number compadd -a numbers 
fi 
0

我解决了我的情况有以下:

IFS=' 
' 
local -a options 
_arguments "1:first:->first" "*:next:->next" 
case "$state" in 
    first) 
     for o in $(_command_to_autocomplete_first); do 
      options+=("$o") 
     done 
     _describe 'values' options 
    ;; 
    next) 
     for o in $(_command_to_complete_others $words[2]); do 
      options+=("$o") 
     done 
     _describe 'values' options 
    ;; 
esac