Documentación
La finalización de API en la función de punto se puede encontrar en la documentación de completion-at-point-functions
Cada función en este gancho se llama por turnos sin ningún argumento y debe devolver nil para indicar que no es aplicable en el punto, o una función de ningún argumento para completar (desaconsejado), o una lista de la forma (INICIO FINAL COLECCIÓN . PROPS) donde START y END delimitan la entidad para completar y deben incluir el punto, COLLECTION es la tabla de finalización que se usará para completarlo, y PROPS es una lista de propiedades para información adicional.
start
, end
y props
son obvios, pero creo que el formato de collection
no está definido correctamente. Para eso puedes ver la documentación de try-completion
oall-completions
Si COLLECTION es una lista, las claves (carros de elementos) son las posibles terminaciones. Si un elemento no es una celda de contras, entonces el elemento en sí es la posible finalización. Si COLLECTION es una tabla hash, todas las teclas que son cadenas o símbolos son las posibles terminaciones. Si COLLECTION es una matriz, los nombres de todos los símbolos en la matriz son las posibles terminaciones.
COLECCIÓN también puede ser una función para completarlo. Recibe tres argumentos: los valores STRING, PREDICATE y nil. Lo que devuelve se convierte en el valor de 'try-complete'.
Ejemplo
A continuación se muestra un ejemplo simple de finalización en la función de punto que utiliza las palabras definidas en /etc/dictionaries-common/words
para completar las palabras en el búfer
(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))))))))
La función de finalización busca la palabra en el punto (la biblioteca thingatpt
se usa para encontrar los límites de la palabra) y la completa contra las palabras en el /etc/dictionaries-common/words
archivo, la propiedad :exclusive
se configura para no
que emacs pueda usar otras funciones capf si falla. Finalmente, se establecen algunas propiedades adicionales para mejorar la integración en modo empresa.
Actuación
El archivo de palabras en mi sistema tenía 99171 entradas y emacs pudo completarlas sin ningún problema, por lo que supongo que 15000 entradas no deberían ser un problema.
Integración con modo empresa
El modo de empresa se integra muy bien con el completion-at-point-functions
uso del company-capf
backend, por lo que debería funcionar props
de forma inmediata para usted, pero puede mejorar las terminaciones ofrecidas por la empresa al devolver más en el resultado de la función capf. Los accesorios actualmente admitidos son
:company-doc-buffer
- Utilizado por la empresa para mostrar metadatos para el candidato actual
:company-docsig
- Utilizado por la empresa para hacer eco de metadatos sobre el candidato en el minibúfer
:company-location
- Utilizado por la empresa para saltar a la ubicación del candidato actual
@Iqbal Ansari dio una gran respuesta. Aquí hay una respuesta complementaria, espero que ayude.
Aquí hay una implementación utilizando el mecanismo de finalización clásico de emacs, 2009.
El siguiente es el código que hace la finalización.
Lo siguiente es una implementación usando la interfaz de ido-mode. Mucho mas simple.
Deberá definir xyz-kwdList como una lista de sus palabras.
fuente
null
encimanot
y usando identificadores en camello y símbolos griegos que solo tienen sentido en sus propios modos.completion-at-point-functions
(no estoy de acuerdo con @wasamasa sobre lo denull
vsnot
).completion-at-point-functions
supone que las funciones en devolver datos de finalización, no realizar la finalización ellos mismos. Por lo tanto, las funciones en su respuesta no se pueden usar como entradas encompletion-at-point-functions
.