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.
Com o código postado, after
myscript --A
Tab, zsh tenta completar um argumento de opção ou não de opção número 1. A ação para o argumento 1 está vazia, o que se enquadra no que o manual descreve em “(espaço único sem aspas)” (este caso é realmente acionado se a ação consistir apenas em zero ou mais caracteres de espaço):Não há mensagem para exibir: a entrada da mensagem é um espaço único, portanto a ação “exibir” não tem efeito visual. Porém, as ações internas de exibição de uma mensagem (in
_message
) são executadas e, em particular,compstate[insert]
são definidas como vazias. 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 correção é fazer com que o zsh pense explicitamente que não há conclusões , em vez de deixá-lo pensar que há conclusões, mas elas não podem ser geradas . Qualquer um dos seguintes servirá:
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).