Spec-Zone.ru › Bash

Программируемое автодополнение

​

Когда пользователь пытается выполнить автодополнение слова для команды или аргумента команды, для которой с помощью встроенной команды complete была определена спецификация автодополнения (compspec) (см. раздел Встроенные команды программируемого автодополнения), Readline вызывает средства программируемого автодополнения.

Сначала Bash определяет имя команды. Если для этой команды определена compspec, она используется для создания списка возможных вариантов автодополнения слова. Если слово команды представляет собой пустую строку (автодополнение выполняется в начале пустой строки), Bash использует любую compspec, определённую с параметром -E для complete. Параметр -I для complete указывает, что слово команды является первым словом в строке, не являющимся присваиванием, либо следует за разделителем команд, таким как «;» или «|». Обычно это указывает на автодополнение имени команды.

Если слово команды является полным путём, Bash сначала ищет compspec для полного пути. Если compspec для полного пути не найдена, Bash пытается найти compspec для части пути после последней косой черты. Если в результате этих поисков compspec не найдена или для слова команды нет compspec, Bash использует любую compspec, определённую с параметром -D для complete в качестве значения по умолчанию. Если compspec по умолчанию отсутствует, Bash в крайнем случае выполняет раскрытие псевдонима для слова команды и пытается найти compspec для слова команды, полученного в результате успешного раскрытия.

Если compspec не найдена, Bash выполняет описанное выше автодополнение по умолчанию (см. раздел Позвольте Readline вводить за вас). В противном случае, как только compspec найдена, Bash использует её для создания списка подходящих слов.

Сначала Bash выполняет действия, заданные в actions compspec. При этом возвращаются только совпадения, являющиеся префиксами дополняемого слова. Когда для автодополнения имени файла или каталога используется параметр -f или -d, Bash использует переменную оболочки FIGNORE для фильтрации совпадений. Описание FIGNORE см. в разделе Переменные Bash.

Затем программируемое автодополнение создаёт совпадения, заданные шаблоном раскрытия имён путей, переданным в качестве аргумента параметру -G. Слова, созданные по шаблону, не обязательно должны совпадать с дополняемым словом. Bash использует переменную FIGNORE для фильтрации совпадений, но не использует переменную оболочки GLOBIGNORE.

Затем автодополнение обрабатывает строку, указанную в качестве аргумента параметру -W. Сначала строка разбивается на части с использованием символов специальной переменной IFS в качестве разделителей. При этом учитываются кавычки оболочки внутри строки, что позволяет включать в слова метасимволы оболочки или символы из значения IFS. Затем каждое слово раскрывается с помощью раскрытия скобок, раскрытия тильды, раскрытия параметров и переменных, подстановки команд и арифметического раскрытия, как описано выше (см. раздел Раскрытия оболочки). Результаты разбиваются на части согласно описанным выше правилам (см. раздел Разбиение слов). Результаты раскрытия сравниваются с дополняемым словом по префиксу, и совпавшие слова становятся возможными вариантами автодополнения.

После создания этих совпадений Bash выполняет любую функцию оболочки или команду, заданную параметрами -F и -C. При вызове команды или функции Bash присваивает значения переменным COMP_LINE, COMP_POINT, COMP_KEY и COMP_TYPE, как описано выше (см. раздел Переменные Bash). Если вызывается функция оболочки, Bash также задаёт переменные COMP_WORDS и COMP_CWORD. При вызове функции или команды первый аргумент ($1) — это имя команды, аргументы которой дополняются, второй аргумент ($2) — дополняемое слово, а третий аргумент ($3) — слово, предшествующее дополняемому слову в текущей командной строке. Сгенерированные варианты автодополнения не фильтруются по дополняемому слову; функция или команда может свободно формировать совпадения, и они не обязаны быть префиксами этого слова.

Сначала вызывается любая функция, заданная параметром -F. Для создания совпадений функция может использовать любые средства оболочки, в том числе описанные ниже встроенные команды compgen и compopt (см. раздел Встроенные команды программируемого автодополнения). Возможные варианты автодополнения функция должна поместить в массивную переменную COMPREPLY, по одному в каждый элемент массива.

Затем команда, заданная параметром -C, вызывается в окружении, эквивалентном подстановке команды. Она должна вывести список вариантов автодополнения в стандартный вывод, по одному на строку. При необходимости обратная косая черта экранирует символ новой строки. Эти варианты добавляются к набору возможных вариантов автодополнения.

После создания всех возможных вариантов автодополнения Bash применяет к ним фильтр, заданный параметром -X. Фильтр представляет собой шаблон, используемый для раскрытия имён путей; символ «&» в шаблоне заменяется текстом дополняемого слова. Буквальный символ «&» можно экранировать обратной косой чертой; перед проверкой совпадения обратная косая черта удаляется. Все варианты автодополнения, совпавшие с шаблоном, удаляются из списка. Начальный символ «!» инвертирует шаблон; в этом случае Bash удаляет все варианты автодополнения, не совпавшие с шаблоном. Если включён параметр оболочки nocasematch (см. описание shopt в разделе Встроенная команда Shopt), Bash выполняет сопоставление без учёта регистра букв.

Наконец, программируемое автодополнение добавляет к каждому варианту автодополнения префикс и суффикс, заданные параметрами -P и -S соответственно, и возвращает результат Readline в виде списка возможных вариантов автодополнения.

Если ранее выполненные действия не создали совпадений и при определении compspec для complete был указан параметр -o dirnames, Bash пытается выполнить автодополнение имён каталогов.

Если при определении compspec для complete был указан параметр -o plusdirs, Bash пытается выполнить автодополнение имён каталогов и добавляет все совпадения к набору возможных вариантов автодополнения.

По умолчанию, если compspec найдена, всё, что она создаёт, возвращается коду автодополнения как полный набор возможных вариантов. Стандартные варианты автодополнения Bash и автодополнение имён файлов по умолчанию в Readline отключены. Если при определении compspec для complete был указан параметр -o bashdefault, а compspec не создаёт совпадений, Bash пытается использовать свои варианты автодополнения по умолчанию. Если ни compspec, ни стандартные варианты автодополнения Bash (если выполнялась такая попытка) не создают совпадений, а при определении compspec для complete был указан параметр -o default, программируемое автодополнение выполняет автодополнение по умолчанию в Readline.

Параметры, переданные в complete и compopt, могут управлять обработкой вариантов автодополнения в Readline. Например, параметр -o fullquote указывает Readline заключать совпадения в кавычки так, как если бы они были именами файлов. Подробности см. в описании complete (см. раздел Встроенные команды программируемого автодополнения).

Когда compspec указывает, что требуется автодополнение имён каталогов, функции программируемого автодополнения заставляют Readline добавлять косую черту к дополняемым именам, являющимся символическими ссылками на каталоги, с учётом значения переменной Readline mark-directories и независимо от значения переменной Readline mark-symlinked-directories.

Предусмотрена поддержка динамического изменения вариантов автодополнения. Она наиболее полезна в сочетании с автодополнением по умолчанию, заданным параметром -D. Функции оболочки, выполняемые в качестве функций автодополнения, могут указать, что автодополнение нужно повторить, вернув код завершения 124. Если функция оболочки возвращает 124 и изменяет compspec, связанную с командой, для которой выполняется автодополнение (она передаётся функции в качестве первого аргумента при её вызове), программируемое автодополнение перезапускается с самого начала и пытается найти новую compspec для этой команды. Это позволяет динамически создавать набор вариантов автодополнения по мере выполнения автодополнения, а не загружать их все сразу.

Например, предположим, что существует библиотека compspec, каждая из которых хранится в файле с именем соответствующей команды. Тогда следующая функция автодополнения по умолчанию будет динамически загружать варианты автодополнения:

_completion_loader()
{
    . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
}
complete -D -F _completion_loader -o bashdefault -o default

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API