21.6.8 Автодополнение в обычных буферах

Хотя автодополнение обычно выполняется в минибуфере, функция автодополнения также может использоваться для текста в обычных буферах 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 для создания оберточной функции:

;; Избегайте этой схемы.
(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:

Функция: completion-in-region start end collection &optional predicate

Эта функция дополняет текст в текущем буфере между позициями start и end, используя collection. Аргумент collection имеет то же значение, что и в try-completion (см. Функции базового автодополнения).

Эта функция вставляет текст автодополнения непосредственно в текущий буфер. В отличие от completing-read (см. Автодополнение и минибуфер), она не активирует минибуфер.

Для работы этой функции точка должна находиться где-то между start и end.