Как написать функцию завершения zsh для команд-оболочек

Как написать функцию завершения zsh для команд-оболочек

Я пытаюсь написать функцию завершения для пользовательской оболочки SSH под названием myssh. myssh принимает аргументы командной строки в одной из следующих форм:

myssh [myssh options] [ssh args]

или

myssh [myssh options] -- [ssh options] [ssh args]

Как можно обеспечить автодополнение для специфичных для myssh опций, повторно используя существующее автодополнение для ssh?

правка: Я бы тоже хотел использовать _gnu_genericфункциюупомянуто здесьдля заполнения параметров myssh.

решение1

В более общем случае, когда комментарий @Franklin\ Yu недостаточен, вы можете создать соответствующую команду завершения. Возьмем, к примеру, команду flux. Эта команда, как и многие ей подобные, довольно требовательна и ожидает, что ее первым параметром команды завершения будет имя исходной команды, поэтому это не срабатывает:

$ compdef myflux=flux
$ myflux<tab>
l2advertisement.yaml  pool.yaml # <--- not expected

Введение вспомогательной команды, которая заменяет первую myfluxв $wordsпеременной, исправляет эту проблему:

_myflux() {
  words="flux ${words[@]:1}"     # replace myflux with flux, in `words` array
  _flux                           # call original completion command which expects a words array beginning with `flux`
}

$ compdef _myflux myflux

$ myflux<tab> 
bootstrap   -- Deploy Flux on a cluster the GitOps way.
build       -- Build a flux resource
check ...
...
# the above *is* expected.

Иногда вы оборачиваете исходную команду подкомандами, напримерflux get source

Строка с мутацией массива $wordsтогда будет выглядеть так:

  words="flux get source ${words[@]:1}"

Связанный контент