Se você olhar para a função _cd()
em / etc / bash_completion , verá que ela anexa a barra à direita e que completa é chamada com o caractere opção -o nospace
para cd .
Você pode fazer o mesmo para xyz , mas ter que verificar separadamente se a correspondência encontrada é um diretório (se for o caso, acrescentar barra) ou um arquivo (se for o caso, acrescentar espaço). Isso deve ser feito em um loop para processar todas as correspondências encontradas.
Além disso, para manipular corretamente os caminhos que contêm espaços, você precisa definir o separador de arquivo interno como somente nova linha e escapar dos espaços. Usar IFS=$'\n'
em combinação com printf %q
faz o trabalho de conclusão com quase todos os caracteres. 1 Cuidado especial deve ser tomado para não escapar do espaço à direita.
Os seguintes itens devem funcionar:
_xyz ()
{
local IFS=$'\n'
local LASTCHAR=' '
COMPREPLY=($(compgen -o plusdirs -f -X '!*.txt' \
-- "${COMP_WORDS[COMP_CWORD]}"))
if [ ${#COMPREPLY[@]} = 1 ]; then
[ -d "$COMPREPLY" ] && LASTCHAR=/
COMPREPLY=$(printf %q%s "$COMPREPLY" "$LASTCHAR")
else
for ((i=0; i < ${#COMPREPLY[@]}; i++)); do
[ -d "${COMPREPLY[$i]}" ] && COMPREPLY[$i]=${COMPREPLY[$i]}/
done
fi
return 0
}
complete -o nospace -F _xyz xyz
1 O caractere de nova linha é a exceção óbvia aqui, já que é um separador interno de arquivos.