У меня есть программа, которая принимает «глобальные» необязательные аргументы, начинающиеся с «-», которые можно поместить до или после необязательных подкоманд.Мои попытки конфигурирования автозаполнения в zsh неожиданно провалились:
Вот минимальная конфигурация автозаполнения, которую я мог бы сделать, чтобы продемонстрировать:
#compdef myprog
local curcontext="$curcontext" state line
typeset -A opt_args
local -a opts; opts=('--first' '--second')
_arguments -C -s -S $opts ':cmd:->cmds' '*::args:->args'
case $state in
cmds)
local -a cmds;
cmds=('piano:play the piano'
'synth:play the synth')
_describe -t cmds "command" cmds;;
args)
case $line[1] in
piano) __piano;;
synth) __synth;;
esac;;
esac
__piano() {
opts+=('--third' '--fourth')
_arguments -C -s -S $opts
}
__synth() {
opts+=('--fifth' '--sixth')
_arguments -C -s -S $opts
}
Когда я вкладываю после подкоманды "фортепиано«Я получаю все четыре варианта, как я ожидаю:
> myprog piano --<TAB>
--first --fourth --second --third
далее, если я добавлю вкладку после добавления опции, добавленной в __piano (), я все равно получу оставшиеся три, также, как и ожидалось:
> myprog piano --third --<TAB>
--first --fourth --second
Теперь, когда я вкладываю после одной из опций «верхнего уровня» (в данном случае - --first или --second), автозаполнение думает, что --second является единственной оставшейся опцией иэто заполняет его. То есть:
> myprog piano --first --<TAB>
приводит к:
> myprog piano --first --second
, и дальнейшее автозаполнение пустое.Поэтому мой вопрос в том, что я делаю неправильно в определении завершения и как мне получить необязательные параметры для автозаполнения по обе стороны подкоманды?