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

Когда я использую такую ​​программу, как svn, и я набираю в терминале Gnome:

svn upd

и нажимаю Tab, она автозаполняется:

svn update

Возможно ли это сделать что-то вроде этого в моем пользовательском сценарии bash?

1
задан 11 March 2018 в 08:34

3 ответа

Я опоздал на шесть месяцев, но я искал то же самое и нашел это:

Вам нужно будет создать новый файл:

/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

149
ответ дан 25 May 2018 в 18:00
  • 1
    Это должен быть принятый ответ! Это полный пример. – Victor Schröder 14 August 2015 в 14:21
  • 2
    Совет. Если кто-то хочет предложения для слов, не начинающиеся с -, и покажите их без необходимости вводить целевое слово, просто удалите строки if [...] then и fi. – Cedric Reichenbach 16 September 2015 в 12:23
  • 3
    Это точный ответ, который я искал часами, и, оказывается, он просто утонул в какой-то сложной документации, которая просто не упоминает, что файл должен быть помещен в /etc/bash_completion.d/. Я только приехал сюда, потому что хотел где-то отправить ответ, но, оказывается, кто-то был на все три года вперед. Ясный, лаконичный и полный пример, спасибо! – Time Sheep 14 December 2016 в 13:43
  • 4

Вот полный учебник.

Давайте посмотрим пример скрипта под названием 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

27
ответ дан 25 May 2018 в 18:00

Если все, что вам нужно, - это простое автозавершение на основе слова (так что никакое завершение подкоманды или что-то еще), команда 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> автозаполняет для меня.

jupyter [ ! d2] на gnu.org.

Кажется, что он полагается на правильную настройку переменной 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
6
ответ дан 25 May 2018 в 18:00

Другие вопросы по тегам:

Похожие вопросы: