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

34

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

fooOption
barOption

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

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

$ ./cooltool foo_

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

$ ./cooltool fooOption _

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

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

Ответы:

2

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

grawity
источник
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 в вашей системе.

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

AlexTheBird
источник
1
Я использую Mac OS X 10.6, поэтому нет каталога /etc/bash_completion.d
Ах хорошо, приятно знать.
2

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

complete -W "fooOption barOption" cooltool

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

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

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

dcc310
источник