Cómo escribir la función de finalización de zsh para comandos contenedores

Cómo escribir la función de finalización de zsh para comandos contenedores

Estoy intentando escribir una función de finalización para un contenedor personalizado alrededor de SSH llamado myssh. myssh toma argumentos de línea de comando en cualquiera de las siguientes formas:

myssh [myssh options] [ssh args]

o

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

¿Cómo puedo proporcionar finalización para opciones específicas de myssh mientras reutilizo la finalización existente para ssh?

editar: también me gustaría usar la _gnu_genericfunciónmencionado aquípor completar las opciones de myssh.

Respuesta1

En un caso más general donde el comentario de @Franklin\ Yu no es suficiente, puedes realizar el comando de finalización correspondiente. Tomemos por ejemplo el fluxcomando. Este comando, y muchos similares, es bastante exigente y espera que su primer parámetro del comando de finalización sea el nombre del comando original, por lo que esto falla:

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

La introducción de un comando auxiliar que reemplaza el primero myfluxen la $wordsvariable soluciona este problema:

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

A veces estás envolviendo un comando original con subcomandos, comoflux get source

La línea con la mutación del $wordsarray quedaría entonces:

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

información relacionada