Документация
Функция завершения API в точке может быть найдена в документации completion-at-point-functions
Каждая функция в этом хуке вызывается по очереди без какого-либо аргумента и должна возвращать либо ноль, чтобы означать, что она не применима в данный момент, либо функцию без аргумента для выполнения завершения (не рекомендуется), или список формы (START END COLLECTION . PROPS), где START и END разграничивают объект для завершения и должны включать точку, COLLECTION - это таблица завершения, которую нужно использовать для ее завершения, а PROPS - это список свойств для дополнительной информации.
start
, end
И props
очевидны, но я думаю , что формат collection
не определен правильно. Для этого вы можете увидеть документацию try-completion
илиall-completions
Если COLLECTION - это список, ключи (машины элементов) являются возможными дополнениями. Если элемент не является cons-ячейкой, то сам элемент является возможным завершением. Если COLLECTION является хеш-таблицей, все ключи, которые являются строками или символами, являются возможными дополнениями. Если COLLECTION является obarray, имена всех символов в obarray являются возможными дополнениями.
COLLECTION также может быть функцией для выполнения самого завершения. Он получает три аргумента: значения STRING, PREDICATE и nil. Все, что он возвращает, становится значением `try-complete '.
пример
Ниже приведен простой пример функции завершения в точке, которая использует слова, определенные в /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 мог использовать другие функции capf в случае сбоя. Наконец, некоторые дополнительные свойства установлены для улучшения интеграции в режиме компании.
Представление
Файл слов в моей системе содержал 99171 записей, и emacs смог завершить их без каких-либо проблем, поэтому я думаю, 15000 записей не должно быть проблемой.
Интеграция с режимом компании
Режим компании очень хорошо интегрируется с completion-at-point-functions
использованием company-capf
бэкэнда, поэтому он должен работать «из коробки» для вас, но вы можете улучшить дополнения, предлагаемые компанией, возвращая дополнительные props
в результате функции capf. В настоящее время поддерживаются реквизиты
:company-doc-buffer
- Используется компанией для отображения метаданных для текущего кандидата
:company-docsig
- Используется компанией для вывода метаданных о кандидате в минибуфер
:company-location
- Используется компанией для перехода к местоположению текущего кандидата
@Икбал Ансари дал отличный ответ. Вот дополнительный ответ, надеюсь, это поможет.
Вот реализация, использующая классический механизм завершения emacs, 2009.
Ниже приведен код, который выполняет завершение.
Ниже приведена реализация с использованием интерфейса ido-mode. Гораздо проще
Вам нужно определить xyz-kwdList как список ваших слов.
источник
null
болееnot
и используя camelcased идентификаторов и греческие символы , которые только имеют смысл в ваших собственных режимах.completion-at-point-functions
(я не согласен с @wasamasa насчет вещиnull
противnot
).completion-at-point-functions
должны возвращать данные завершения, а не выполнять их самостоятельно. Таким образом, функции в вашем ответе не могут использоваться как записи вcompletion-at-point-functions
.