Когда я использую такую программу svn
и набираю в Gnome Terminal:
svn upd
и нажмите Tabкнопку автозаполнения:
svn update
Возможно ли сделать что-то подобное в моем собственном скрипте bash?
решение1
Вам придется создать новый файл:
/etc/bash_completion.d/foo
Для статического автодополнения ( например, --help
/ ) добавьте это:--verbose
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
представляет собой массив, содержащий все отдельные слова в текущей командной строке.COMP_CWORD
индекс слова, содержащего текущую позицию курсора.COMPREPLY
— это переменная массива, из которой Bash считывает возможные варианты завершения.
А compgen
команда возвращает массив элементов из --help
, --verbose
соответствующих --version
текущему слову "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
решение2
Вот полное руководство.
Давайте рассмотрим пример скрипта, admin.sh
для которого вы хотели бы, чтобы работало автозаполнение.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_2
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Обратите внимание на опцию shortlist
. Вызов скрипта с этой опцией выведет все возможные опции для этого скрипта.
А вот и скрипт автозаполнения:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Обратите внимание, что последний аргумент для завершения — это имя скрипта, к которому вы хотите добавить автодополнение. Все, что вам нужно сделать, это добавить ваш скрипт автодополнения в bashrc как:
source /path/to/your/autocomplete.sh
или скопируйте его в:
/etc/bash_completion.d
решение3
Вы можете использоватьПрограммируемое завершение. Посмотрите на /etc/bash_completion
и /etc/bash_completion.d/*
для некоторых примеров.
решение4
Если вам нужно простое автодополнение на основе слов (без завершения подкоманд или чего-то подобного), complete
у команды есть -W
опция, которая делает то, что нужно.
Например, у меня есть следующие строки .bashrc
для автозаполнения программы под названиемюпитер:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB>
у меня автозаполнение.
Theдокументына gnu.org полезны.
Похоже, что это зависит от IFS
правильности установки переменной, но у меня это не вызвало никаких проблем.
Чтобы добавить автодополнение имени файла и автодополнение BASH по умолчанию, используйте опцию -o
:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Чтобы использовать это в zsh, добавьте следующий код перед запуском complete
команды в вашем ~/.zshrc
:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi