(以及有关切换到eglot的其它配置)
eglot
使用project.el
定位项目根目录,而project.el
调用一些函数 寻找项目根目录。函数的要求如链接所说,要返回一个项目实体。不过很缺乏文档啊,不太知道该怎么写。
还有26的flymake
怎么样,直接加到prog-mode-hook
效果如何?
由于不喜欢cquery
自带的头文件补全,自己用(cquery-file-info)
获取了参数传给company-c-headers
。eglot
好像也没有头文件补全,搞了个类似的:
(jsonrpc-request (eglot--current-server-or-lose) :$cquery/fileInfo `(:textDocument ,(eglot--TextDocumentItem)))
不过还没试,不把项目根目录换了暂时不换过来。。。
没有自定义过,不过 project.el 默认通过 VC 来找到项目根的,结果就是 .git/.svn 所在目录。
头文件补全我看 eglot 和 ccls 源码,似乎是 ccls 提供支持。
是的,不过我就是想把VC那个换了。
ccls的话,我有个账号没有C++17,以前也在有的账号上弄过,遇到点问题,就没用了。
我觉得C/C++的server应该补全preprocessor commands而不是头文件。C/C++的头文件直接找的文件系统,这点company-c-headers
就处理得更接近文件系统点,ccls
和cquery
还是专注语义上的补全比较好。
应该就是一个 cons , car 表示类型, cdr 表示对应的目录。比如 project-current
中的 fallback :
(setq pr (cons 'transient dir)
以及:
(defun project-try-vc (dir)
(let* ((backend (ignore-errors (vc-responsible-backend dir)))
(root (and backend (ignore-errors
(vc-call-backend backend 'root dir)))))
(and root (cons 'vc root))))
project.el 中支持两个类型( eglot 中也用了 project-roots
):
(cl-defmethod project-roots ((project (head transient)))
(list (cdr project)))
;; ...
(cl-defmethod project-roots ((project (head vc)))
(list (cdr project)))
另外注意下这个 API 是实验性的:
;; NOTE: The project API is still experimental and can change in major,
;; backward-incompatible ways. Everyone is encouraged to try it, and
;; report to us any problems or use cases we hadn't anticipated, by
;; sending an email to emacs-devel, or `M-x report-emacs-bug'.
把上边 github 那个回复中的 pom
符号,替换成你想要的符号即可。
试用了下eglot,优点是 out of box,自动使用内置的 project.el 和 flymake,功能基本可用,还比较稳定。不过缺点也不少,比 lsp-mode 功能弱不少,尤其查看文档用的 sidewindow 之类的,需要频繁移动目光到底部。另外补全速度比 lsp-mode 还慢,偶尔还失效。输入文字时有延迟。
补全速度我刚开始用,还没感觉。功能的话,我觉得不错吧,mode-line
自动显示外部引用了多少,改代码很方便。
短板来自flymake
,没目前的flycheck
好用。还有就是可能可设置项比较少,我没看到哪里关高亮的。。。
喷了$cquery/fileInfo
好像在最新版的cquery
里变了 。。。
glgl-schemer:
最新版的 cquery
里变了
如上所说,我在想我的配置能不能写一个包出来。这之前还没写过。我看写个包,好像就是对注释的格式有点要求?
目前包里可以包含一个文件名列表来给project.el
设置项目根目录,一个文件名列表用作Compilation Database
,一个用以覆盖或替换project-try-vc
的函数,一个读取Compilation Database
的函数,一个保存读取出来的编译参数的变量,两个从这些变量里读取头文件目录的函数(一个<>
一个""
),一个读取出编译参数后执行的hook
。
我不清楚别人有这个需求没有,要不要进melpa
。。。