Как создать скрипт с автозаполнением?

Как создать скрипт с автозаполнением?

Когда я использую такую ​​программу 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

Связанный контент