Finalización de zsh para script personalizado: URL + parámetros opcionales

Finalización de zsh para script personalizado: URL + parámetros opcionales

Tengo finalización zsh para script personalizado, donde un parámetro debe ser URL (es decir, cadena) y luego hay varios parámetros opcionales: --AAA --BBB --CCC:

_arguments -S : \
    '--AAA' \
    '--BBB' \
    '--CCC' \
    '1: :'

sin embargo, la finalización sólo funciona después de que se haya proporcionado el parámetro URL, es decir:

myscript URL --A<TAB>

esto se autocompletará--AAA

Pero cuando tengo:

myscript --A<TAB>

luego enumerará la única opción coincidente: AAA, pero no la completará automáticamente incluso si lo hago --AA<TAB>. Tengo que escribirlo manualmente.

Cuando cambio mi secuencia de comandos de finalización a:

_arguments -S : \
    '--AAA' \
    '--BBB' \
    '--CCC'

El autocompletado de parámetros funciona, pero tan pronto como proporciono la URL, no se completan otras opciones.

Entonces, ¿cómo le digo a zsh que mi secuencia de comandos espera una URL (es decir, un argumento de cadena; no quiero que zsh comience a completar archivos en la ubicación actual) y que los parámetros opcionales se pueden completar antes o después de esta URL?

Nota: No estoy intentando completar automáticamente la URL. Solo estoy tratando de completar el trabajo antes y después de esta cadena de URL.

Respuesta1

Con el código publicado, después de myscript --ATab, zsh intenta completar un argumento número 1 con opción o sin opción. La acción para el argumento 1 está vacía, lo que cae en lo quemanualse describe en “(espacio único sin comillas)” (este caso en realidad se activa si la acción consta únicamente de cero o más caracteres de espacio):

Esto es útil cuando se requiere un argumento pero no es posible o deseable generar coincidencias para él. Se mostrará el mensaje pero no se enumerarán las terminaciones.

No hay ningún mensaje para mostrar: la entrada del mensaje es un solo espacio, por lo que la acción de "mostrar" no tiene ningún efecto visual. Sin embargo, las acciones internas de mostrar un mensaje (en_message) se realizan, y en particularcompstate[insert]está configurado para estar vacío. Esto indica a la interfaz de usuario de finalización que la finalización es ambigua, incluso si resulta que hay una única finalización válida.

La solución es hacer arreglos explícitos para que zsh piense queno hay terminaciones, en lugar de dejarle pensar quehay terminaciones pero no se pueden generar. Cualquiera de los siguientes servirá:

_arguments … '1: :()'
_arguments … '1: :{}'
_arguments … '1: : true'

Eso sí, si el argumento es una URL, probablemente deberías usar _urls. Esto seguirá dando como resultado que solo se completen las opciones después de escribir -(siempre que ninguna URL comience con a -o tenga algunas configuraciones de finalización de subcadenas muy agresivas).

información relacionada