Não consigo complete
oferecer sugestões completas quando as opções ${COMPREPLY[@]}
contêm um :
caractere. Em vez disso, oferece apenas o prefixo comum a todas as sugestões.
Aqui está um exemplo que funciona bem:
_foo()
{
local cur=${COMP_WORDS[$COMP_CWORD]}
COMPREPLY=( $(compgen -W "bart baze" -- "$cur" ) )
}
complete -F _foo foo
E aqui está como é usado (nunca pressiono Enter, apenas TABonde indicado)
$ foo <tab>
$ foo ba <-- Autocompletes common prefix, good
$ foo ba<tab>
bart baze <-- Suggests options, good
$ foo bar<tab>
$ foo bart <-- Autocompletes the only option, good
Mas se eu acrescentar algo com a :
, like http://
, ele não fornecerá sugestões completas (apenas o prefixo comum a todas as opções):
$ _foo()
{
local cur=${COMP_WORDS[$COMP_CWORD]}
COMPREPLY=( $(compgen -W "h:bart h:baze" -- "$cur" ) )
}
$ complete -F _foo foo
$ foo <tab>
$ foo h:ba <-- Autocompletes common prefix, good
$ foo h:ba<tab>
$ foo h:ba <-- No effect
O manual sugere algo sobre -I
como trabalhar com delimitadores, mas complete -I -F _foo foo
não muda nada.
Se eu inspecionar mais profundamente, parece que é como complete -F
interpreta ${COMPREPLY[@]}
. compgen
parece estar COMPREPLY
bem.
$ COMPREPLY=( $(compgen -W "h:bart h:baze" -- h) )
$ for i in "${COMPREPLY[@]}"; do echo "$i"; done
h:bart
h:baze
O comentário de @meuh me levou a https://stackoverflow.com/questions/10528695/how-to-reset-comp-wordbreaks-without-affecting-other-completion-script que me levou à resposta.
Bash fornece uma série de macros para ajudar no
/etc/bash_completion
. No debian, esta fonte é/usr/share/bash-completion/bash_completion
.Navegando neste arquivo existem algumas maneiras de lidar com os dois pontos:
_init_completion -n :
removerá:
de$COMP_WORDBREAKS
. Mas chamar apenas isso não é suficiente, ou você verá que^.*:
isso se repete no resultado do preenchimento automático__ltrim_colon_completions
removerá o início^.*:
da conclusão, o que corrige um pouco o problema anterior.O resultado é:
As sugestões são um pouco estranhas, especialmente se você estava esperando
http://example.com
e conseguiu//example.com
, mas funciona .Mas a documentação para
__ltrim_colon_completions()
diz:Não sou muito fã de impor
/etc/bash.bashrc
, especialmente porque esse script de conclusão será implantado em um pacote e não estou fazendo edições locais. Essa mudança também pode alterar o comportamento de outros scripts de conclusão que realmente dependem do:
separador para analisar coisas como$PATH
.A solução que encontrei foi definir isso no meu
/usr/share/bash-completion/completions/foo
script:É difícil dizer se isso terá um impacto global. Um novo shell não foi
$COMP_WORDBREAKS
definido, mas não tenho certeza sebash-completion
será redefinido entre as conclusões.