Dokumentasi
Fungsi penyelesaian API pada titik dapat ditemukan dalam dokumentasi completion-at-point-functions
Setiap fungsi pada hook ini dipanggil secara bergantian tanpa argumen dan harus mengembalikan nihil berarti bahwa itu tidak berlaku pada titik, atau fungsi tidak ada argumen untuk melakukan penyelesaian (putus asa), atau daftar formulir (MULAI KOLEKSI MULAI . PROPS) tempat MULAI dan AKHIR membatasi entitas untuk diisi dan harus menyertakan titik, KOLEKSI adalah tabel penyelesaian untuk digunakan untuk melengkapinya, dan PROPS adalah daftar properti untuk informasi tambahan.
start
, end
dan props
sudah jelas, tapi saya pikir formatnya collection
tidak didefinisikan dengan benar. Untuk itu Anda bisa melihat dokumentasi try-completion
atauall-completions
Jika KOLEKSI adalah daftar, kunci (mobil elemen) adalah kemungkinan penyelesaian. Jika suatu elemen bukan sel kontra, maka elemen itu sendiri adalah penyelesaian yang mungkin. Jika COLLECTION adalah tabel hash, semua kunci yang merupakan string atau simbol adalah kemungkinan penyelesaian. Jika KOLEKSI adalah obarray, nama-nama semua simbol dalam obarray adalah pelengkap yang mungkin.
KOLEKSI juga bisa menjadi fungsi untuk menyelesaikannya sendiri. Ia menerima tiga argumen: nilai-nilai STRING, PREDICATE dan nil. Apa pun yang dikembalikan menjadi nilai `coba-penyelesaian '.
Contoh
Di bawah ini adalah contoh sederhana penyelesaian pada fungsi titik yang menggunakan kata-kata yang didefinisikan /etc/dictionaries-common/words
untuk melengkapi kata-kata dalam buffer
(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))))))))
Fungsi penyelesaian mencari kata pada titik (perpustakaan thingatpt
digunakan untuk menemukan batas-batas kata) dan melengkapinya dengan kata-kata dalam /etc/dictionaries-common/words
file, properti :exclusive
diatur ke no
sehingga emacs dapat menggunakan fungsi capf lainnya jika kami gagal. Akhirnya beberapa properti tambahan diatur untuk meningkatkan integrasi mode perusahaan.
Performa
File kata-kata di sistem saya memiliki 99171 entri dan emacs dapat menyelesaikannya tanpa masalah, jadi saya kira 15.000 entri seharusnya tidak menjadi masalah.
Integrasi dengan mode perusahaan
Mode perusahaan terintegrasi dengan sangat baik dengan completion-at-point-functions
menggunakan company-capf
backend, jadi itu harus bekerja di luar kotak untuk Anda, tetapi Anda dapat meningkatkan penyelesaian yang ditawarkan oleh perusahaan dengan mengembalikan tambahan props
dalam hasil fungsi capf. Alat peraga yang saat ini didukung adalah
:company-doc-buffer
- Digunakan oleh perusahaan untuk menampilkan metadata untuk kandidat saat ini
:company-docsig
- Digunakan oleh perusahaan untuk menggemakan metadata tentang kandidat di minibuffer
:company-location
- Digunakan oleh perusahaan untuk melompat ke lokasi kandidat saat ini
@Iqbal Ansari memberikan jawaban yang bagus. Ini jawaban tambahan, semoga bisa membantu.
Berikut ini adalah implementasi menggunakan mekanisme penyelesaian klasik emacs, 2009.
Berikut ini adalah kode yang menyelesaikannya.
Berikut ini adalah implementasi menggunakan antarmuka ido-mode. Jauh lebih sederhana.
Anda perlu mendefinisikan xyz-kwdList sebagai daftar kata-kata Anda.
sumber
null
lebihnot
dan menggunakan pengidentifikasi camelc dan simbol yunani yang hanya masuk akal dalam mode Anda sendiri.completion-at-point-functions
(saya tidak setuju dengan @wasamasa tentang halnull
vsnot
).completion-at-point-functions
seharusnya mengembalikan data penyelesaian, bukan melakukan penyelesaian sendiri. Jadi fungsi dalam jawaban Anda tidak dapat digunakan sebagai entricompletion-at-point-functions
.