文献资料
API完成点功能可以在以下文档中找到 completion-at-point-functions
依次调用此钩子上的每个函数,不带任何参数,并且应返回nil表示不适用于该点,或者返回不带参数的函数来执行完成(不建议使用),或者返回形式列表(START END COLLECTION) 。(PROPS),其中START和END界定要完成的实体,并应包含点,COLLECTION是用于完成它的完成表,而PROPS是其他信息的属性列表。
start
,end
而且props
很明显,但是我认为的格式collection
定义不正确。为此,您可以查看try-completion
或的文档all-completions
如果COLLECTION是清单,则键(元素的车)可能是补全。如果元素不是约束单元,则元素本身就是可能的补全。如果COLLECTION是哈希表,则所有字符串或符号键都是可能的补全。如果COLLECTION是一个obarray,则obarray中所有符号的名称都是可能的补全。
COLLECTION也可以是完成本身的功能。它接收三个参数:值STRING,PREDICATE和nil。无论返回什么,都将成为“ try-completion”的值。
例
以下是点函数完成的简单示例,该函数使用中定义的单词/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函数。最后,设置一些其他属性以增强公司模式集成。
性能
我系统上的word文件有99171个条目,而emacs能够完整地完成它们,所以我想15000个条目应该不是问题。
与公司模式整合
公司模式与completion-at-point-functions
使用company-capf
后端很好地集成在一起,因此它应该为您方便地使用,但是您可以通过返回props
capf函数结果中的其他内容来增强公司提供的完成功能。目前支持的道具是
:company-doc-buffer
-公司用于显示当前候选人的元数据
:company-docsig
-由公司用于回传有关迷你缓冲区中候选人的元数据
:company-location
-公司用于跳转到当前候选人的位置