Завершение пользовательской вкладки bash


34

У меня есть пользовательская консольная утилита cooltoolсо списком опций

fooOption
barOption

Что я должен сделать, чтобы bash мог завершить автозаполнение, нажав tabклавишу?

Я имею в виду пользователь набрал

$ ./cooltool foo_

затем нажал tab. А потом

$ ./cooltool fooOption _

появившийся.


1
Не пересекать пост.
Вуфферс

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

Ответы:


2

Напишите скрипт завершения bash для cooltool. Пакет bash- creation поставляется со сценариями для многих популярных программ, которые вы можете использовать в качестве примеров.


40

Самый простой способ - добавить следующее в ваш .bashrc.

_cooltool()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "fooOption barOption" -- $cur) )
}
complete -F _cooltool cooltool

Всякий раз, когда вы печатаете cooltool f[TAB][TAB], _cooltool()вызывается функция. Он определит ваше текущее частичное слово, а затем compgenопределит, какие варианты соответствуют. Они хранятся в массиве с именем, COMPREPLYкоторый затем отображается. Посмотрите на man completeи man compgenдля деталей.

Для хорошего учебника проверьте: Написание вашей собственной функции завершения Bash


7

Возможно, вы захотите поближе взглянуть на каталог /etc/bash_completion.d в вашей системе.

Также вы должны прочитать это введение . Вторая часть введения является один вам нужно.


1
Я использую Mac OS X 10.6, поэтому нет каталога /etc/bash_completion.d

Ах хорошо, приятно знать.


2

В дополнение к ответу на собачьи упущения вы также можете сделать:

complete -W "fooOption barOption" cooltool

если вы просто хотите сопоставить список слов с начала строки. Кажется, что полный и компенг разделяют большинство вариантов. Я заметил только соответствие «начало строки» в командах, которые я использую, поэтому я обнаружил, что вы можете делать другие вещи в функции _cooltool, например:

COMPREPLY=( $(grep "$cur" ~/my_potential_args.txt) )

совпадать в любом месте в имени опции.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.