这只是一个尚不成熟的初步设想,发出来避免自己闭门造车,也许还有更好的解决方案
开始想自己写一个补全后端自用,但能力有限难以做到,又发现lsp以外的各种补全后端其实也是相当好用的,只要解决数据源问题在加上弹出文档功能就行了。
数据源问题不知如何解决,这里说下目前我是如何加上弹出文档功能的。
1、定义弹出文档数据源
(defun company-my-doc-buffer (arg modename) ;;arg值是补全项,第二个参数是major-mode
"定义弹出文档显示的数据源"
(with-current-buffer (get-buffer-create "*my-doc*")
(erase-buffer)
(when arg
(save-excursion
;;(insert arg)
;;(insert (shell-command-to-string (format "php.exe -f d:/www/emacs.php -- %s %s"
;; (url-encode-url arg) modename ) ))
(url-insert-file-contents
(format
"http://localhost/emacs.php?p=%s&mode=%s"
(url-encode-url arg) modename ))
(current-buffer)))
))
我主要就写点js,css,php,个人习惯是把所有数据都保存在数据库里而不是保存在文本文件里。
数据库主要用mysql,sqlite因为在持续不间断写入数据时会锁表导致做不了数据查询操作,不知道怎么解决这个问题,现在不怎么用了。
这里为了能尽快上手,就没用elisp来连接mysql读取文档数据。而是用了其它语言先写好,elisp用shell-command-to-string
或者url-insert-file-contents
调用(目前还没遇到性能问题和卡emacs情况).
2、找一个没见有弹出文档功能但是好用的company后端把这个函数加进去。
比如@redguardtoo大佬的company-ctags
,找到安装包位置,我的是~./emacs.d/elpa/company-ctags-20201121.1116/company-ctags.el
在第476左右找到(candidates (company-ctags--candidates arg))
这句后面加上(doc-buffer (company-my-doc-buffer arg major-mode))
,然后光标移到最外层括号c-x c-e
要重启emacs后也能用需要m-x byte-compile-file
编译出company-ctags.elc
文件
这个方法不太好,应该有更好的方法可以不用改动el源文件的,如果有人知道请告知。
companpy自带的company-abbrev-code,company-keywords
等我也用一样的方法加上了弹出文档功能。
当然要具备弹出文档功能还要装上company-quickhelp
或company-posframe
否则需要在候选项上按c-h或f1才会有弹出文档。
效果图
剩下的就是数据源问题了…