Documentation
La fonction d'achèvement de l'API au point se trouve dans la documentation de completion-at-point-functions
Chaque fonction de ce hook est appelée tour à tour sans argument et doit renvoyer soit zéro pour signifier qu'elle n'est pas applicable au point, soit une fonction sans argument pour effectuer la complétion (déconseillée), ou une liste du formulaire (START END COLLECTION . PROPS) où START et END délimitent l'entité à compléter et doivent inclure un point, COLLECTION est la table d'achèvement à utiliser pour la compléter et PROPS est une liste de propriétés pour des informations supplémentaires.
start
, end
et props
sont évidents, mais je pense que le format de collection
n'est pas défini correctement. Pour cela, vous pouvez voir la documentation de try-completion
ouall-completions
Si COLLECTION est une liste, les clés (voitures d'éléments) sont les compléments possibles. Si un élément n'est pas une contre-cellule, alors l'élément lui-même est l'achèvement possible. Si COLLECTION est une table de hachage, toutes les clés qui sont des chaînes ou des symboles sont les compléments possibles. Si COLLECTION est un obarray, les noms de tous les symboles dans l'obarray sont les compléments possibles.
La COLLECTION peut également être une fonction pour effectuer la finition elle-même. Il reçoit trois arguments: les valeurs STRING, PREDICATE et nil. Tout ce qu'il retourne devient la valeur de la «tentative d'achèvement».
Exemple
Vous trouverez ci-dessous un exemple simple de fonction d'achèvement au point qui utilise les mots définis dans /etc/dictionaries-common/words
pour compléter les mots dans le tampon
(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 fonction d'achèvement recherche le mot au point (la bibliothèque thingatpt
est utilisée pour trouver les limites du mot) et le complète par rapport aux mots du /etc/dictionaries-common/words
fichier, la propriété :exclusive
est définie sur no
afin qu'emacs puisse utiliser d'autres fonctions capf en cas d'échec. Enfin, certaines propriétés supplémentaires sont définies pour améliorer l'intégration en mode entreprise.
Performance
Le fichier de mots sur mon système avait 99171 entrées et emacs a pu les compléter sans aucun problème, donc je suppose que 15000 entrées ne devraient pas être un problème.
Intégration avec le mode entreprise
Le mode entreprise s'intègre très bien à l' completion-at-point-functions
utilisation du company-capf
backend, il devrait donc fonctionner dès la sortie de la boîte pour vous, mais vous pouvez améliorer les complétions proposées par l'entreprise en renvoyant des props
résultats supplémentaires grâce à la fonction capf. Les accessoires actuellement pris en charge sont
:company-doc-buffer
- Utilisé par l'entreprise pour afficher les métadonnées du candidat actuel
:company-docsig
- Utilisé par l'entreprise pour faire écho aux métadonnées sur le candidat dans le mini-tampon
:company-location
- Utilisé par l'entreprise pour accéder à l'emplacement du candidat actuel
@Iqbal Ansari a donné une excellente réponse. Voici une réponse supplémentaire, j'espère que cela vous aidera.
Voici une implémentation utilisant le mécanisme d'achèvement classique d'emacs, 2009.
Voici le code qui effectue l'achèvement.
Voici une implémentation utilisant l'interface de ido-mode. Beaucoup plus simple.
Vous devrez définir xyz-kwdList comme une liste de vos mots.
la source
null
delànot
et utiliser des identifiants camelcasés et des symboles grecs qui n'ont de sens que dans vos propres modes.completion-at-point-functions
(je ne suis pas d'accord avec @wasamasa sur lenull
vsnot
).completion-at-point-functions
sont censées renvoyer des données d'achèvement, et non effectuer l'achèvement elles-mêmes. Les fonctions de votre réponse ne sont donc pas utilisables comme entrées danscompletion-at-point-functions
.