Автозаполнение аргументов командной строки - PullRequest
34 голосов
/ 11 сентября 2010

В bash исполняемые файлы, такие как mplayer и imagemagick's convert, имеют классную функцию автозаполнения в своих аргументах командной строки. Например, если я наберу

mplayer <tab><tab>

в одной из моих папок с видео, затем mplayer выведет список всех медиа-файлов, находящихся в этой папке, и только медиа-файлы.

Аналогично, если я наберу

convert -<tab><tab>

тогда я увижу все возможные варианты скрипта конвертации, что здорово.

У меня вопрос, как добиться аналогичной функциональности, используя скрипты bash, ruby ​​или python?

Ответы [ 3 ]

34 голосов
/ 11 сентября 2010

Это пример умного завершения BASH. Основное описание - здесь , руководство по написанию собственных расширений - здесь , а другое (на основе Debian) - здесь . А вот более полное введение в команду complete (команда, облегчающая такое поведение).

РЕДАКТИРОВАТЬ: фиксированные мертвые ссылки

3 голосов
/ 11 сентября 2010

Эта функциональность в bash предоставляется bash-creation , а аналогичная функциональность включена в zsh. Если вы хотите добавить поддержку для некоторых программ, которые в настоящее время не поддерживаются одним из этих инструментов, вам необходимо написать собственные расширения для них.

2 голосов
/ 28 февраля 2018

Ссылка на запись собственного расширения в принятом ответе не работает.Цитируя здесь http://web.archive.org/web/20090409201619/http://ifacethoughts.net/2009/04/06/extending-bash-auto-completion/

Bash предоставляет вам способ указания ваших ключевых слов и их использования для автоматического заполнения аргументов командной строки для вашего приложения.Я использую vim в качестве вики, менеджера задач и контактов.Система справки vim позволяет мне индексировать контент, а не искать его, и скорость показывает это.Одна функция, которую я хотел добавить к этому, состояла в том, чтобы получить доступ к этим тегам извне vim.

Это можно сделать прямым способом:

$ vim -t tagname

Это приведет меня непосредственно к определенному контенту, отмеченномуиспользуя этот тег.Однако это будет более продуктивно, если я смогу обеспечить автозаполнение тегов.

Сначала я определил функцию Bash для командной строки vim.Я добавил следующий код в мой файл .bashrc:

function get {
    vim -t $1
} Now I can use get tagname command to get to the content.

Программируемое завершение в Bash выполняется с помощью сценария / etc / bash-creation.Этот скрипт позволяет нам добавить наш каталог скрипта автозаполнения /etc/bash-completion.d/ и выполняет его всякий раз, когда он вызывается.Поэтому в этот каталог я добавил файл сценария get со следующим кодом:

_get()
{
    local cur
    COMPREPLY=()
    #Variable to hold the current word
    cur="${COMP_WORDS[COMP_CWORD]}"

    #Build a list of our keywords for auto-completion using
    #the tags file
    local tags=$(for t in `cat /home/anadgouda/wiki/tags | \
                      awk '{print $1}'`; do echo ${t}; done)

    #Generate possible matches and store them in the
    #array variable COMPREPLY
    COMPREPLY=($(compgen -W "${tags}" $cur))
}

#Assign the auto-completion function _get for our command get.
complete -F _get get Once the /etc/bash-completion is sourced, you will get auto-completion for the tags when you use the get command.

Наряду с вики я использую его для всей документации, а иногда и для кода.Я также использую файл тегов, созданный из моего кода.Система индексирования позволяет мне запоминать контекст вместо имен файлов и каталогов.

Вы можете настроить эту систему для любых инструментов, которые вы используете.Все, что вам нужно сделать, это получить список ключевых слов для вашей команды и передать его в систему программируемого завершения Bash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...