Я пытаюсь настроить скрипт завершения bash и у меня возникли проблемы.
Я хотел бы настроить его так, чтобы перечисленные дополнения были либо файлами, соответствующими определенному расширению, либо каталогами (которые могут содержать или не содержать файлы этого расширения).
Проблема, с которой я столкнулся, заключается в том, что единственный способ получить дополнения для хранения файлов и каталогов - использовать что-то вроде этого -o plusdirs -f -X '!*.txt'
, но когда я позволяю bash завершить один из каталогов, он просто добавляет пробел в конец, а не слэш.
_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
Я также перепробовал все закомментированные строки, но они даже не расширяют каталоги.
Для тестирования я запускал это в каталоге с одним файлом .txt и одним каталогом "dir" (с файлом внутри .txt, хотя это пока не имеет значения). Печатая xyz <TAB>
с этой функцией перечисляет каталог и файл .txt, но печатая xyz d<TAB>
расширяется до xyz dir
(хорошо, с пробелом после "dir").
Я думаю, что это простое решение работает в том, что оно:
.txt
Ключ передавался
-o filenames
для завершения. Это было проверено на GNU bash 3.2.25 на RHEL 5.3 и GNU bash 4.3.18 на osxисточник