Como escrever a função de conclusão zsh para comandos wrapper

Como escrever a função de conclusão zsh para comandos wrapper

Estou tentando escrever uma função de conclusão para um wrapper personalizado em torno do SSH chamado myssh. myssh aceita argumentos de linha de comando em qualquer uma das seguintes formas:

myssh [myssh options] [ssh args]

ou

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

Como posso fornecer preenchimento para opções específicas do myssh enquanto reutilizo o preenchimento existente para ssh?

editar: eu também gostaria de usar a _gnu_genericfunçãomencionado aquipara completar as opções myssh.

Responder1

Em um caso mais geral, onde o comentário de @Franklin\ Yu não é suficiente, você pode executar um comando de conclusão correspondente. Tomemos por exemplo o fluxcomando. Este comando, e muitos outros semelhantes, é bastante exigente e espera que seu primeiro parâmetro para o comando de conclusão seja o nome do comando original, então isso falha:

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

A introdução de um comando auxiliar que substitui o primeiro myfluxna $wordsvariável corrige isso:

_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.

Às vezes você está agrupando um comando original com subcomandos, comoflux get source

A linha com a mutação do $wordsarray se tornaria então:

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

informação relacionada