Emacs中project.el需要的project实体是什么?

(以及有关切换到eglot的其它配置)

eglot使用project.el定位项目根目录,而project.el调用一些函数寻找项目根目录。函数的要求如链接所说,要返回一个项目实体。不过很缺乏文档啊,不太知道该怎么写。

还有26的flymake怎么样,直接加到prog-mode-hook效果如何?

由于不喜欢cquery自带的头文件补全,自己用(cquery-file-info)获取了参数传给company-c-headerseglot好像也没有头文件补全,搞了个类似的:

(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就处理得更接近文件系统点,cclscquery还是专注语义上的补全比较好。

应该就是一个 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'.

想起来之前在 eglot 中遇到问题, @mkcms 提供的定制方法,可以参考下(就是我上边分析的那样): https://github.com/joaotavora/eglot/pull/65#issuecomment-420594919

这个'vc不能随便起名的吧。我随便起了个名字不行,暂时用的vc,但这样仓库就用不了了。

把上边 github 那个回复中的 pom 符号,替换成你想要的符号即可。

试用了下eglot,优点是 out of box,自动使用内置的 project.el 和 flymake,功能基本可用,还比较稳定。不过缺点也不少,比 lsp-mode 功能弱不少,尤其查看文档用的 sidewindow 之类的,需要频繁移动目光到底部。另外补全速度比 lsp-mode 还慢,偶尔还失效。输入文字时有延迟。

补全速度我刚开始用,还没感觉。功能的话,我觉得不错吧,mode-line自动显示外部引用了多少,改代码很方便。

短板来自flymake,没目前的flycheck好用。还有就是可能可设置项比较少,我没看到哪里关高亮的。。。

喷了$cquery/fileInfo好像在最新版的cquery变了。。。

如上所说,我在想我的配置能不能写一个包出来。这之前还没写过。我看写个包,好像就是对注释的格式有点要求?

目前包里可以包含一个文件名列表来给project.el设置项目根目录,一个文件名列表用作Compilation Database,一个用以覆盖或替换project-try-vc的函数,一个读取Compilation Database的函数,一个保存读取出来的编译参数的变量,两个从这些变量里读取头文件目录的函数(一个<>一个""),一个读取出编译参数后执行的hook

我不清楚别人有这个需求没有,要不要进melpa。。。

有实例吗,求一个,自己不太会写呀

看解决方案那层啊。。。