conclusão zsh para script personalizado: URL + parâmetros opcionais

conclusão zsh para script personalizado: URL + parâmetros opcionais

Eu tenho a conclusão zsh para script personalizado, onde um parâmetro deve ser URL (ou seja, string) e existem vários parâmetros opcionais: --AAA --BBB --CCC:

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

no entanto, a conclusão só funciona após o parâmetro URL ter sido fornecido, ou seja:

myscript URL --A<TAB>

isso será preenchido automaticamente--AAA

Mas quando eu tenho:

myscript --A<TAB>

então ele listará a única opção correspondente --AAA, mas não irá preenchê-la automaticamente, mesmo que eu o faça --AA<TAB>. Eu tenho que digitar manualmente.

Quando altero meu script de conclusão para:

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

o preenchimento automático de parâmetros funciona, mas assim que eu forneço o URL, nenhuma outra opção será concluída.

Então, como posso dizer à conclusão do zsh que meu script espera um URL (ou seja, um argumento de string - não quero que o zsh comece a completar os nomes de arquivos no local atual) e os parâmetros opcionais podem ser concluídos antes ou depois deste URL?

Observação: não estou tentando preencher automaticamente o URL. Estou apenas tentando fazer com que a conclusão funcione antes e depois dessa string de URL.

Responder1

Com o código postado, after myscript --ATab, zsh tenta completar um argumento de opção ou não-opção número 1. A ação para o argumento 1 está vazia, o que se enquadra no que omanualdescreve em “(espaço único sem aspas)” (este caso é realmente acionado se a ação consistir apenas em zero ou mais caracteres de espaço):

Isto é útil quando um argumento é necessário, mas não é possível ou desejável gerar correspondências para ele. A mensagem será exibida, mas nenhuma conclusão será listada.

Não há mensagem para exibir: a entrada da mensagem é um espaço único, portanto a ação “exibir” não tem efeito visual. No entanto, as ações internas de exibição de uma mensagem (em_message) são realizados e, em particularcompstate[insert]está definido para estar vazio. Isso sinaliza para a interface do usuário de conclusão que a conclusão é ambígua, mesmo que haja uma única conclusão válida.

A solução é fazer com que o zsh pense explicitamente quenão há conclusões, em vez de deixá-lo pensar quehá conclusões, mas elas não podem ser geradas. Qualquer um dos seguintes servirá:

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

Lembre-se, se o argumento for uma URL, você provavelmente deveria usar _urls. Isso ainda resultará em preenchimentos apenas para opções após a digitação -(desde que nenhum URL comece com a -ou você tenha algumas configurações de preenchimento de substring muito agressivas).

informação relacionada