2010-09-11 2 views
32

В bash исполняемые файлы, такие как «конвертировать» mplayer и imagemagick, имеют классную функцию автозаполнения в своих аргументах командной строки. Например, если я типаАргументы автозавершения командной строки

mplayer <tab><tab> 

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

Точно так же, если я типа

convert -<tab><tab> 

тогда я буду видеть все возможные варианты сценария новообращенного, который является большим.

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

ответ

30

Это пример умного завершения BASH. Основным описанием является here, руководство по написанию собственных расширений - here, а другое руководство (на основе Debian) - here. И вот fuller featured introduction команде complete (команда, которая облегчает это поведение).

EDIT: фиксированный мертвые ссылки

3

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

1

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

Bash предоставляет вам возможность определить ключевые слова и использовать их для автозаполнения аргументов командной строки для приложения. Я использую vim в качестве вики, менеджера задач и контактов. Система wim helptags позволяет меня индексировать контент, а не искать через него, и скорость показывает это. Одна из особенностей, которую я хотел добавить к этому, заключалась в доступе к этим тегам со стороны 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-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.

+0

Спасибо! Я только что зафиксировал ссылки в принятом ответе. –

Смежные вопросы