автозаполнение zsh с помощью подкоманд и унаследованных параметров - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть программа, которая принимает «глобальные» необязательные аргументы, начинающиеся с «-», которые можно поместить до или после необязательных подкоманд.Мои попытки конфигурирования автозаполнения в 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

, и дальнейшее автозаполнение пустое.Поэтому мой вопрос в том, что я делаю неправильно в определении завершения и как мне получить необязательные параметры для автозаполнения по обе стороны подкоманды?

...