Хотя автодополнение обычно выполняется в минибуфере,
функция автодополнения также может использоваться для текста в обычных
буферах Emacs. Во многих основных режимах автодополнение в буфере
выполняется командой C-M-i или M-TAB,
привязанной к completion-at-point. См. Автодополнение символов в Руководстве GNU Emacs.
Эта команда использует переменную хука completion-at-point-functions:
Значение этой переменной хука должно быть списком функций, которые используются для вычисления таблицы автодополнения (см. Функции базового автодополнения) для дополнения текста в точке. Она может использоваться основными режимами для предоставления таблиц автодополнения, специфичных для режима (см. Соглашения основных режимов).
Когда выполняется команда completion-at-point, она вызывает
функции в списке по очереди, без каких-либо аргументов. Каждая функция
должна вернуть nil, если она не может и не хочет
брать на себя ответственность за данные автодополнения для текста в точке.
В противном случае она должна вернуть список следующей формы:
(start end collection . props)
start и end определяют текст для дополнения (который
должен включать точку). collection — это таблица автодополнения
для дополнения этого текста в форме, подходящей для передачи в качестве второго
аргумента в try-completion (см. Функции базового автодополнения);
альтернативы автодополнения будут сгенерированы из этой таблицы автодополнения
обычным образом, с помощью стилей автодополнения, определенных в completion-styles
(см. Переменные автодополнения). props — это список свойств для
дополнительной информации; распознаются любые свойства в
completion-extra-properties (см. Переменные автодополнения), а также следующие дополнительные:
:predicateЗначение должно быть предикатом, который должны удовлетворять кандидаты автодополнения.
:exclusiveЕсли значение равно no, то если таблица автодополнения не
соответствует тексту в точке, completion-at-point переходит к
следующей функции в completion-at-point-functions вместо
сообщения об ошибке автодополнения.
Функции в этом хуке должны, как правило, выполняться быстро, поскольку они могут
вызываться очень часто (например, из post-command-hook).
Настоятельно рекомендуется предоставлять функцию для collection,
если генерация списка дополнений является дорогостоящей операцией. Emacs может
внутренне вызывать функции в completion-at-point-functions много
раз, но следует быть осторожным с значением collection только
для некоторых из этих вызовов. Предоставляя функцию для collection,
Emacs может отложить генерацию дополнений до необходимого момента. Вы можете
использовать completion-table-dynamic для создания оберточной
функции:
;; Избегайте этой схемы.
(let ((beg ...) (end ...) (my-completions (my-make-completions)))
(list beg end my-completions))
;; Используйте вместо этого.
(let ((beg ...) (end ...))
(list beg
end
(completion-table-dynamic
(lambda (_)
(my-make-completions)))))
Кроме того, collection в целом не должна предварительно
фильтроваться на основе текущего текста между start и
end, поскольку это обязанность вызывающей стороны
completion-at-point-functions делать это в соответствии со
стилями автодополнения, которые она решает использовать.
Функция в completion-at-point-functions также может вернуть
функцию вместо списка, как описано выше. В этом случае возвращенная функция
вызывается без аргументов и полностью отвечает за выполнение автодополнения.
Мы не рекомендуем это использование; оно предназначено только для помощи в
конвертации старого кода к использованию completion-at-point.
Первая функция в completion-at-point-functions, которая
возвращает не-nil значение, используется completion-at-point.
Остальные функции не вызываются. Исключение из этого — когда есть спецификация
:exclusive, как описано выше.
Следующая функция предоставляет удобный способ выполнения автодополнения на произвольном участке текста в буфере Emacs:
Эта функция дополняет текст в текущем буфере между позициями
start и end, используя collection.
Аргумент collection имеет то же значение, что и в
try-completion (см. Функции базового автодополнения).
Эта функция вставляет текст автодополнения непосредственно в текущий
буфер. В отличие от completing-read (см. Автодополнение и минибуфер),
она не активирует минибуфер.
Для работы этой функции точка должна находиться где-то между start и end.