Próbuję skonfigurować skrypt kończący bash i mam problemy.
Chciałbym to skonfigurować, aby wymienione uzupełnienia były albo plikami pasującymi do określonego rozszerzenia, albo katalogami (które mogą, ale nie muszą zawierać pliki tego rozszerzenia).
Problem, który mam, polega na tym, że jedynym sposobem, w jaki mogę uzyskać uzupełnienia zawierające pliki i katalogi, jest użycie czegoś podobnego -o plusdirs -f -X '!*.txt'
, ale kiedy pozwolę bash skompletować jeden z katalogów, po prostu dodaje spację na końcu, a nie ciąć.
_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
Próbowałem też wszystkich skomentowanych wierszy, ale nawet nie rozszerzają katalogów.
Do testowania uruchomiłem to w katalogu z jednym plikiem .txt i jednym katalogiem „dir” (z plikiem .txt w nim, choć to jeszcze nie ma znaczenia). Pisanie za xyz <TAB>
pomocą tej funkcji wyświetla katalog i plik .txt, ale pisanie xyz d<TAB>
rozwija się do xyz dir
(cóż, ze spacją po „dir”).
Myślę, że to proste rozwiązanie działa w ten sposób, że:
.txt
Klucz był przekazywany
-o filenames
do ukończenia. Zostało to przetestowane na GNU bash 3.2.25 na RHEL 5.3 i GNU bash 4.3.18 na osxźródło