
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 --A
Tab, 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).