2016-11-29 7 views
0

Я пытаюсь согнуть zsh, свою оболочку выбора, по своей воле и полностью потерять синтаксис и работу доработок. Мой случай использования заключается в следующем: я хотел бы иметь автозаполнения «анзибль-пьес» под «-e» поддержка опции три варианта:Zsh пополнения с несколькими повторными опциями

  • Нормальное завершение файла: ansible-playbook -e vars/file_name.yml
  • предваряется завершение файла: ansible-playbook -e @vars/file_name.yml
  • произвольные строки: ansible-playbook -e key=value

Я начал с https://github.com/zsh-users/zsh-completions/blob/master/src/_ansible-playbook, которая работала прилично, но необходимые изменения для поддержки приставки файла Pathing. Для достижения этой цели я изменил следующие строки (строки -е):

... 
"(-D --diff)"{-D,--diff}"[when changing (small files and templates, show the diff in those. Works great with --check)]"\ 
"(-e --extra-vars)"{-e,--extra-vars}"[EXTRA_VARS set additional variables as key=value or YAML/JSON]:extra vars:(EXTRA_VARS)"\ 
'--flush-cache[clear the fact cache]'\ 

к этому:

... 
"(-D --diff)"{-D,--diff}"[when changing (small files and templates, show the diff in those. Works great with --check)]"\ 
"(-e --extra-vars)"{-e,--extra-vars}"[EXTRA_VARS set additional variables as key=value or YAML/JSON]:extra vars:__at_files"\ 
'--flush-cache[clear the fact cache]'\ 

и добавил функцию '__at_files':

__at_files() { 
    compset -P @; _files 
} 

Это может быть очень noobish, но для тех, кто никогда не сталкивался с этим раньше, я был доволен, что это решило мою проблему, или так я думал.

Это не работает, если у меня есть несколько параметров «-e», что является полностью поддерживаемой моделью (подобно тому, как докеры допускают несколько аргументов -v или -p). Это означает, что первый параметр «-e» будет иметь мою префиксную работу по завершению, но любые параметры «-e» после этой точки становятся «тупыми» и позволяют только завершить нормальные «_files» из того, что я могу сказать. Таким образом, следующий не будет успешно завершена:

ansible-playbook -e key=value -e @vars/file 

, но это будет для завершения самого файла:

ansible-playbook -e key=value -e vars/file 

ли я запутались? Я вижу один и тот же тип поведения для опции «-M» данного плагина завершения (он также становится «немым» и выполняет базовое завершение файла). Возможно, я просто не искал правильную терминологию или комбинацию терминов, или, может быть, в довольно сложной документации не хватало того, что покрывает это, но опять же, всего лишь за несколько дней опыта в этом, я теряюсь.

ответ

1

Если несколько -e опций действительны, спецификация _arguments должна начинаться с * так вместо:

"(-e --extra-vars)"{-e,--extra-vars}"[EXTR .... 

использование:

\*{-e,--extra-vars}"[EXTR ... 

(-e --extra-vars) часть показывает список опций, которые не могут следуйте указанному. Таким образом, это не требуется больше, поскольку, по-видимому, это действительно необходимо, например:

ansible-playbook -e key-value --extra-vars @vars/file 
Смежные вопросы