1

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

一个例子:函数“foo”的第一个参数可以有“a”或“b”的值。如果第一个参数是“a”,则第二个参数可以具有值“10”或“11”,如果第一个参数是“b”,则可以具有值“20”和“21”。所以下面的参数组合是合法的:

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

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

zsh 完成系统文档非常晦涩难懂,而且很棒的How To也没有解决我的问题。最接近的是使用_arguments,可能与状态操作一起使用,但我没有设法使其工作。

4

2 回答 2

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
于 2016-09-19T23:02:46.857 回答
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
于 2016-09-20T22:29:36.777 回答