Документація
Функція завершення API в точці можна знайти в документації completion-at-point-functions
Кожна функція цього гака викликається по черзі без будь-якого аргументу і повинна повертати або нуль, щоб означати, що вона не застосовується в точці, або функцію без аргументу для виконання завершення (відмовляє), або список форми (НАЧАЛО КОНТРОЛЬНА КОЛЕКЦІЯ . PROPS), де START і END обмежують об'єкт для завершення і повинен включати крапку, COLLECTION - це таблиця завершення, яка використовується для її заповнення, а PROPS - список властивостей для додаткової інформації.
start
, end
і props
очевидні, але я думаю, що формат collection
не визначений належним чином. Для цього ви можете ознайомитися з документацією try-completion
абоall-completions
Якщо КОЛЕКЦІЯ є алістом, то ключі (машини елементів) - це можливі доповнення. Якщо елемент не є осередком мінусу, то самим елементом є можливе завершення. Якщо КОЛЕКЦІЯ є хеш-таблицею, усі ключі, що є рядками або символами, є можливими доповненнями. Якщо КОЛЕКЦІЯ - це koarray, імена всіх символів у koarray є можливим доповненням.
COLLECTION також може бути функцією, щоб зробити завершення самостійно. Він отримує три аргументи: значення STRING, PREDICATE та нуль. Все, що вона повертає, стає значенням "спроба завершення".
Приклад
Нижче наводиться простий приклад виконання функції в точці, яка використовує слова, визначені в, /etc/dictionaries-common/words
для завершення слів у буфері
(defvar words (split-string (with-temp-buffer
(insert-file-contents-literally "/etc/dictionaries-common/words")
(buffer-string))
"\n"))
(defun words-completion-at-point ()
(let ((bounds (bounds-of-thing-at-point 'word)))
(when bounds
(list (car bounds)
(cdr bounds)
words
:exclusive 'no
:company-docsig #'identity
:company-doc-buffer (lambda (cand)
(company-doc-buffer (format "'%s' is defined in '/etc/dictionaries-common/words'" cand)))
:company-location (lambda (cand)
(with-current-buffer (find-file-noselect "/etc/dictionaries-common/words")
(goto-char (point-min))
(cons (current-buffer) (search-forward cand nil t))))))))
Функція завершення шукає слово в точці (бібліотека thingatpt
використовується для пошуку меж слова) і доповнює його до слів у /etc/dictionaries-common/words
файлі, властивість :exclusive
встановлюється no
таким чином, що emacs може використовувати інші функції кефіру, якщо наші не вдаються. Нарешті, деякі додаткові властивості встановлюються для покращення інтеграції в режим компанії.
Продуктивність
У файлі слів у моїй системі було 99171 записів, і emacs зміг їх виконати без жодних проблем, тому, мабуть, 15000 записів не повинно бути проблемою.
Інтеграція з режимом компанії
Режим компанії дуже добре інтегрується з completion-at-point-functions
використанням company-capf
бекенда, тому він повинен вийти з коробки для вас, але ви можете покращити запропоновані компанією завершення, повернувши додаткові props
в результаті функції кефіру. Наразі підтримуються реквізити
:company-doc-buffer
- Використовується компанією для відображення метаданих для поточного кандидата
:company-docsig
- Використовується компанією для відображення метаданих про кандидата в мінібуфер
:company-location
- Використовується компанією, щоб перейти на місце поточного кандидата