Dokumentacja
Zakończenie funkcji API w punkcie można znaleźć w dokumentacji completion-at-point-functions
Każda funkcja na tym haku jest wywoływana po kolei bez żadnego argumentu i powinna zwracać zero lub oznaczać, że nie ma zastosowania w punkcie, lub funkcję braku argumentu do wykonania uzupełnienia (odradzane) lub listę postaci (START KOLEKCJA KOŃCOWA PROPS), gdzie START i END ograniczają jednostkę do uzupełnienia i powinny zawierać punkt, KOLEKCJA jest tabelą wypełnienia do użycia w celu jej uzupełnienia, a PROPS jest listą właściwości dla dodatkowych informacji.
start
, end
I props
są oczywiste, ale myślę, że format collection
nie jest poprawnie zdefiniowany. W tym celu możesz zobaczyć dokumentację try-completion
luball-completions
Jeśli KOLEKCJA jest listą, możliwe są klucze (samochody elementów). Jeśli element nie jest komórką przeciwną, to sam element jest możliwym uzupełnieniem. Jeśli COLLECTION jest tablicą skrótów, wszystkie klucze, które są ciągami znaków lub symbolami, są możliwymi uzupełnieniami. Jeśli COLLECTION jest obarray, nazwy wszystkich symboli w obarray są możliwymi uzupełnieniami.
KOLEKCJA może być również funkcją do wykonania samego uzupełnienia. Otrzymuje trzy argumenty: wartości STRING, PREDICATE i zero. Cokolwiek zwróci, staje się wartością „try-complete”.
Przykład
Poniżej znajduje się prosty przykład zakończenia funkcji w punkcie, która używa słów zdefiniowanych w /etc/dictionaries-common/words
do uzupełnienia słów w buforze
(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))))))))
Funkcja uzupełniania szuka słowa w punkcie (biblioteka thingatpt
służy do znajdowania granic słowa) i uzupełnia je względem słów w /etc/dictionaries-common/words
pliku, właściwość :exclusive
jest ustawiona na no
tak, aby emacs mógł korzystać z innych funkcji capf, jeśli się nie powiedzie. Wreszcie niektóre dodatkowe właściwości zostały ustawione w celu usprawnienia integracji w trybie firmowym.
Wydajność
Plik słów w moim systemie zawierał 99171 wpisów i emacs był w stanie je uzupełnić bez żadnych problemów, więc wydaje mi się, że 15000 wpisów nie powinno stanowić problemu.
Integracja z trybem firmowym
Tryb firmowy bardzo dobrze integruje się z completion-at-point-functions
użyciem company-capf
backendu, więc powinien on działać props
od razu po wyjęciu z pudełka, ale możesz ulepszyć uzupełnienia oferowane przez firmę, zwracając dodatkowe w wyniku funkcji capf. Obecnie obsługiwane są rekwizyty
:company-doc-buffer
- Używany przez firmę do wyświetlania metadanych dla bieżącego kandydata
:company-docsig
- Używany przez firmę do echa metadanych dotyczących kandydata w minibuforze
:company-location
- Używany przez firmę w celu przejścia do lokalizacji aktualnego kandydata
@Iqbal Ansari dał świetną odpowiedź. Oto dodatkowa odpowiedź, mam nadzieję, że pomoże.
Oto implementacja z wykorzystaniem klasycznego mechanizmu uzupełniania emacsa, 2009.
Poniżej znajduje się kod, który wykonuje zakończenie.
Poniżej znajduje się implementacja korzystająca z interfejsu trybu ido. O wiele prostsze.
Musisz zdefiniować xyz-kwdList jako listę swoich słów.
źródło
null
ponadnot
i za pomocą camelCased identyfikatory i greckim symboli, które mają sens tylko własnymi środkami.completion-at-point-functions
(nie zgadzam się z @wasamasa na tematnull
vs vsnot
).completion-at-point-functions
powinny zwracać dane o zakończeniu, a nie same wykonywać. Zatem funkcje w twojej odpowiedzi nie są użyteczne jako wpisy wcompletion-at-point-functions
.