Завершение в обычных буферах
Хотя завершение обычно выполняется в минибуфере, механизм завершения также может использоваться для текста в обычных буферах Emacs. Во многих основных режимах завершение в буфере выполняется командой C-M-i или M-TAB, привязанной к completion-at-point. См. Завершение символов в Справочнике GNU Emacs. Эта команда использует переменную специального крючка completion-at-point-functions.
- Переменная: 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для создания функции-обёртки:;; Avoid this pattern. (let ((beg ...) (end ...) (my-completions (my-make-completions))) (list beg end my-completions)) ;; Use this instead. (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:
- Функция: completion-in-region start end collection &optional predicate
Эта функция завершает текст в текущем буфере между позициями start и end, используя collection. Аргумент collection имеет то же значение, что и в
try-completion(см. Основное завершение).Эта функция вставляет текст завершения непосредственно в текущий буфер. В отличие от
completing-read(см. Завершение в минибуфере), она не активирует минибуфер.Для работы этой функции позиция должна быть где-то между start и end.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion-in-Buffers.html