Программируемое завершение
Иногда невозможно или неудобно заранее создать alist или obarray, содержащий все предполагаемые варианты завершения. В таком случае можно передать собственную функцию для вычисления завершения заданной строки. Это называется программируемым завершением. Emacs использует программируемое завершение при завершении имен файлов (см. Завершение имен файлов), а также во многих других случаях.
Чтобы воспользоваться этой возможностью, передайте функцию в качестве аргумента collection функции completing-read. Функция completing-read передает вашу функцию завершения функциям try-completion, all-completions и другим базовым функциям завершения, которые затем поручают всю работу вашей функции.
Функция завершения должна принимать три аргумента:
- Строку, которую нужно завершить.
- Функцию-предикат для фильтрации возможных совпадений или
nil, если фильтрация не нужна. Функция должна вызывать предикат для каждого возможного совпадения и игнорировать совпадение, если предикат возвращаетnil. - Флаг, задающий тип выполняемой операции завершения; подробное описание этих операций см. в разделе Базовые функции завершения. Флагом может быть одно из следующих значений.
nil-
Этот флаг задает операцию
try-completion. Если совпадений нет, функция должна вернутьnil; если указанная строка является единственным точным совпадением —t; в остальных случаях она должна вернуть самую длинную общую подстроку-префикс всех совпадений. t-
Этот флаг задает операцию
all-completions. Функция должна вернуть список всех возможных вариантов завершения указанной строки. lambda-
Этот флаг задает операцию
test-completion. Если указанная строка точно совпадает с одним из вариантов завершения, функция должна вернутьt; в противном случае —nil. (boundaries . suffix)-
Этот флаг задает операцию
completion-boundaries. Функция должна вернуть(boundaries start . end), где start — позиция начальной границы в указанной строке, а end — позиция конечной границы в suffix.Если программа на Lisp возвращает нетривиальные границы, она должна обеспечить согласованность операции
all-completionsс этими границами. Варианты завершения, возвращаемые функциейall-completions, должны относиться только к той части префикса и суффикса, которая охватывается границами завершения. Точное описание ожидаемой семантики границ завершения см. в разделе Базовые функции завершения. -
metadata Этот флаг запрашивает информацию о состоянии текущего завершения. Возвращаемое значение должно иметь вид
(metadata . alist), где alist — alist, элементы которого описаны ниже.
Если флаг имеет любое другое значение, функция завершения должна вернуть
nil.
Ниже приведен список записей метаданных, которые функция завершения может возвращать в ответ на аргумент-флаг metadata:
-
category -
Значением должен быть символ, описывающий тип текста, который функция завершения пытается завершить. Если символ совпадает с одним из ключей в
completion-category-overrides, стандартное поведение завершения переопределяется. См. раздел Переменные завершения. -
annotation-function -
Значением должна быть функция для добавления аннотаций к вариантам завершения. Функция должна принимать один аргумент — string, представляющий возможный вариант завершения. Она должна возвращать строку, которая отображается после строки варианта завершения string в буфере *Completions*. Если эта функция не задает собственный face для строки суффикса аннотации, к этой строке по умолчанию применяется face
completions-annotations. -
affixation-function -
Значением должна быть функция для добавления префиксов и суффиксов к вариантам завершения. Функция должна принимать один аргумент — completions, то есть список возможных вариантов завершения. Она должна возвращать список completions, каждый элемент которого содержит список из трех элементов: вариант завершения, префикс, отображаемый перед строкой варианта завершения в буфере *Completions*, и суффикс, отображаемый после строки варианта завершения. Эта функция имеет приоритет над
annotation-function. -
group-function -
Значением должна быть функция для группировки кандидатов завершения. Функция должна принимать два аргумента: completion — кандидат завершения, и transform — булев флаг. Если transform имеет значение
nil, функция должна вернуть заголовок группы, к которой относится кандидат. Возвращенный заголовок также может быть равенnil. В противном случае функция должна вернуть преобразованный кандидат. Например, преобразование может удалять избыточный префикс, отображаемый в заголовке группы. -
display-sort-function -
Значением должна быть функция для сортировки вариантов завершения. Функция должна принимать один аргумент — список строк вариантов завершения — и возвращать отсортированный список строк вариантов завершения. Допускается деструктивное изменение входного списка.
-
cycle-sort-function Значением должна быть функция для сортировки вариантов завершения, когда
completion-cycle-thresholdне равенnilи пользователь переключается между вариантами завершения. См. раздел Настройки завершения в Руководстве по GNU Emacs. Список аргументов и возвращаемое значение такие же, как уdisplay-sort-function.
- Функция: completion-table-dynamic function &optional switch-buffer
-
Эта функция позволяет удобно написать функцию, которая может работать как функция программируемого завершения. Аргумент function должен быть функцией, принимающей один аргумент — строку — и возвращающей таблицу завершения (см. Базовые функции завершения), содержащую все возможные варианты завершения. Возвращенная функцией function таблица может также содержать элементы, не совпадающие со строковым аргументом; функция
completion-table-dynamicавтоматически отфильтрует их. В частности, функция function может игнорировать свой аргумент и возвращать полный список всех возможных вариантов завершения. Функциюcompletion-table-dynamicможно рассматривать как преобразователь между функцией function и интерфейсом для функций программируемого завершения.Если необязательный аргумент switch-buffer не равен
nilи завершение выполняется в минибуфере, функция function будет вызвана так, чтобы текущим буфером был буфер, из которого был вызван минибуфер.Возвращаемое значение функции
completion-table-dynamic— это функция, которую можно использовать в качестве 2-го аргумента функцийtry-completionиall-completions. Обратите внимание, что эта функция всегда будет возвращать пустые метаданные и тривиальные границы.
- Функция: completion-table-with-cache function &optional ignore-case
Это обертка для
completion-table-dynamic, которая сохраняет последнюю пару аргумент—результат. Благодаря этому для нескольких поисков с одним и тем же аргументом функцию function достаточно вызвать только один раз. Это может быть полезно при выполнении медленной операции, например при вызове внешнего процесса.
- Функция: completion-table-with-metadata table metadata
Эта функция создает таблицу завершения, которая работает так же, как существующая таблица завершения table, за исключением того, что новая таблица использует alist metadata в качестве метаданных завершения.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Programmed-Completion.html