Estou tentando obter um script de conclusão do bash e tendo alguns problemas.
Gostaria de configurá-lo para que as conclusões listadas sejam arquivos correspondentes a uma extensão específica ou diretórios (que podem ou não conter arquivos dessa extensão).
O problema que estou tendo é que a única maneira de obter as conclusões para conter arquivos e diretórios é usando algo como -o plusdirs -f -X '!*.txt'
, mas quando deixo o bash concluir um dos diretórios, ele apenas adiciona um espaço ao final, em vez de um golpear.
_xyz()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
#COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) )
#COMPREPLY=( $( compgen -o dirnames -f -X '!*.txt' -- $cur ) )
COMPREPLY=( $( compgen -o plusdirs -f -X '!*.txt' -- $cur ) )
return 0
}
complete -F _xyz xyz
Também tentei todas as linhas comentadas, mas elas nem expandem os diretórios.
Para testar, eu tenho executado isso em um diretório com um arquivo .txt e um diretório "dir" (com um arquivo .txt dentro dele, embora isso ainda não importe). Digitar xyz <TAB>
com esta função lista o diretório e o arquivo .txt, mas a digitação se xyz d<TAB>
expande para xyz dir
(bem, com um espaço após "dir").
Penso que esta solução simples funciona na medida em que:
.txt
A chave estava passando
-o filenames
para ser concluída. Isso foi testado no GNU bash 3.2.25 no RHEL 5.3 e GNU bash 4.3.18 no osxfonte