31

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

fooOption
barOption

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

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

$ ./cooltool foo_

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

$ ./cooltool fooOption _

появился.

5 ответов5

39

Самый простой способ - добавить следующее в ваш .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

8

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

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

2

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

2

В дополнение к ответу собачьей страхи, вы также можете сделать:

complete -W "fooOption barOption" cooltool

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .