A seguir, o que eu gostaria de ter.
Quando a conclusão da tabulação é ambígua, o bash imprime a lista de possibilidades. Eu gostaria que ele colorisse o próximo caractere que eu deveria pressionar em cada palavra da lista.
A seguir está o que eu fiz até agora.
Na minha .bashrc eu defini a seguinte função
e chamei o comando completo
_colourunique() {
local word=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -f -- "${word}"))
if [[ "$word" ]] && [[ ${#COMPREPLY[@]} -gt 1 ]]; then
local w
local i=0
for ((i=0;i<${#COMPREPLY[@]};i++)) ; do
w=${COMPREPLY[$i]}
n=${#word}
COMPREPLY[$i]="${w:0:n}3[91m${w:n:1}3[0m${w:$((n+1))}"
done
fi
}
complete -D -F _colourunique
Mas não está funcionando ...
Quando eu digito
ls D[TAB]
Autocomplete como
ls D3[91m
Em vez de listar as possibilidades, documentos, área de trabalho, etc.
O que poderia estar errado aqui?
Ou há algum outro caminho direto para conseguir isso?
UPDATE 1:
Acho que entendo o que está acontecendo aqui. Uma vez que eu adiciono \ 033 [91m para cada palavra em COMPREPLY, o bash vê que esta parte é comum a todos, e autocomplete esse termo comum no próprio prompt de comando. (em vez de simplesmente imprimir a lista)
Portanto, não acho que esse método de edição do array COMPRELICE seja a maneira de fazê-lo.
Existe algum outro método?
UPDATE 2:
Para preservar a uniqness, tentei adicionar um $ i e \ b na string.
COMPREPLY[$i]="${w:0:n}$i\b3[91m${w:n:1}3[0m${w:$((n+1))}"
Agora, imprime as possíveis conclusões da guia da seguinte forma.
D0\b3[91mo3[0mwnloads D1\b3[91me3[0msktop
O que significa que a lista é impressa como tal. Não há avaliação de \ b ou \ 033 [caracteres de 91m. :-(
UPDATE 3:
Como as respostas parecem, não há como realizar o que eu quero no bash (a menos que eu mude para zsh). Eu decidi me contentar com outra opção. Vou tentar acrescentar o próximo toque de tecla exclusivo ao final de cada palavra, para que ele se destaque.
A seguir está o código até o momento.
SanitiseString () {
local String="$1"
local j
for j in \ \! \@ \# \$ \% \^ \& \* \( \) \+ \{ \[ \] \} \| \; \: \" \' \, \? \ ; do
String=${String//"$j"/\"$j"}
done
echo "$String"
}
_colourunique() {
saveIFS=$IFS
IFS=$'\n'
local word=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -f -- "${word}"))
if [[ "$word" ]] ; then
local w
local i=0
for ((i=0;i<${#COMPREPLY[@]};i++)) ; do
w="${COMPREPLY[$i]}"
n=${#word}
w=$(SanitiseString "$w")
if [[ ${#COMPREPLY[@]} -gt 1 ]] ; then
COMPREPLY[$i]="$w :${w:n:1}"
else
COMPREPLY[$i]="$w"
fi
done
fi
IFS=$saveIFS
}
complete -D -F _colourunique
Isso imprimirá as opções com o próximo pressionamento de tecla exclusivo separado por:
Mas o código ainda tem dois problemas irritantes. que eu tenho que resolver
- Já não acrescenta o / no final dos diretórios preenchidos automaticamente
- Ele não faz mais o espaçamento inteligente após o preenchimento automático.
Alguma sugestão?