Когда я использую такую программу, как svn, и я набираю в терминале Gnome:
svn upd
и нажимаю Tab, она автозаполняется:
svn update
Возможно ли это сделать что-то вроде этого в моем пользовательском сценарии bash?
Я опоздал на шесть месяцев, но я искал то же самое и нашел это:
Вам нужно будет создать новый файл:
/etc/bash_completion.d/foo
Для static autocompletion (--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 -W "--help --verbose --version" - "& lt; userinput & gt;" Эта команда возвращает массив элементов из --help, --verbose и --version, соответствующих текущему слову "${cur}"
Источник: http: //www.debian- administration.org/articles/316
Вот полный учебник.
Давайте посмотрим пример скрипта под названием admin.sh, к которому вы хотели бы иметь работу автозаполнения.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Примечание.
И здесь у вас есть сценарий автозаполнения:
_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
Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакое завершение подкоманды или что-то еще), команда complete имеет опцию -W, которая делает правильные вещи.
Для Например, у меня есть следующие строки в моей .bashrc, чтобы автозаполнять программу под названием jupyter:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
Теперь jupyter <TAB> <TAB> автозаполняет для меня.
Кажется, что он полагается на правильную настройку переменной IFS, но это не вызвало у меня никаких проблем.
Чтобы добавить завершение файла и выполнить по умолчанию BASH, используйте параметр -o:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
Чтобы использовать это в zsh, добавьте следующий код перед запуском команды complete в вашем ~/.zshrc: [ ! d8]
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi