emacs + lsp-mode + rtags, 找不到头文件

https://gitee.com/guyuming76/personal/commit/501895d1aefcb4a251a34e8d1f3640e4b2ecc2dc

如 commit message 里的简要描述以及截屏,我在 gentoo 上解压了 clang 的源码,生成了compile_commands.json, 貌似 M-x rtags-find-references-at-point 能工作,但是 M-x lsp 后,cpp 文件里面一开始 include 的 .h 文件找不到。

lsp需要一个后端(比如clangdcqueryccls等)来解析compile_commands.json文件的;需要在init.el里面配置, 推荐ccls。 你可以参考 ccls_wiki 。论坛里面也有很多讨论,你可以搜搜看。

后端我已经有 clangd 了啊,我给的链接里面第一张截图右边窗口下方“状态栏”里显示了 LSP[clangd:3051871];

关于 find-reference , ccls 做得比 clangd 好吗?不用 rtags 行吗?

我可能没表达清楚,我前面给的链接在一个commit里包含了好几张图片,但没有分别描述图片。这下我改了一下图片文件名,以体现截图所要表达的内容:Login - Gitee.com

你用了 lsp-mode + clangd 应该是不需要rtags了。
我么没用过lsp,用的是eglot + clangd,配置比较简单,可以找到头文件并跳转,重命名,格式化代码等。
用lsp 你可以参考下Century 配置。

我打开github上页面经常会打不开,过一阵又好了。慢慢再读你推荐的链接吧。我现在有些基本情况还没搞清楚:

find-references 功能总需要某种形式的索引吧,不管索引是建立在内存还是保存到硬盘的,但对于大的项目,索引如果不保存到硬盘,每次重建岂不是太费时?

在我目前的配置里,我理解 rtags 服务就起到建立维护索引的作用,而emacs 里的rtags 包只是一个rtags 服务的前端。如果没有rtags, 你是说 clangd 会建立这样一个索引?有没有版本限制? eglots 看上去也就像是一个 emacs 里的前端,它会去维护这样一个索引?

我也理解,一个配置,如果出现错误,要问原因及解决,特别是在论坛上,可能是比较难的。换种问法,有没有人用类似的配置是成功的?

其实我主要就是想用emacs 打开 clang 的源码一窥究竟,问题我这会儿连 clang 的 main 入口函数都没找到。 大家都是如何看 clang 源码的?

Index 是 后端clangd 负责的,对于大项目会耗费很多内存和时间。可以参考官方文档。

油管还有个分享视频,就是用的 lsp-mode + clangd 写C++ ,还有他的Emacs配置也许对你有参考作用。

不好意思,没看清你的clangd。 按照楼上说的,lsp配置以后就不用rtags了。会不会是二者🈶️冲突?你把rtags关掉试试?

还有一点,你检查一下compile command json 文件,看看你期望的头文件路径是否正确记录了。如果没有记录路径的话,lsp可能的确找不到。ccls可以通过.cycle文件来指定头文件的索引路径。

油管我看不到啊,多年前在MSFT 内网是能看的。

根据你给的官方参考文档,我在机器上是能找到这样的文件:

gym@gymDeskGentoo ~ $ locate clangd 
/home/gym/.cache/clangd
/home/gym/.cache/clangd/index
/home/gym/.cache/clangd/index/BuildSystem.h.3DEAD48C36EB6E08.idx
/home/gym/.cache/clangd/index/CXCompilationDatabase.h.45A0F646C71274C4.idx
/home/gym/.cache/clangd/index/CXErrorCode.h.DA114972AA0784E4.idx
/home/gym/.cache/clangd/index/CXString.h.5338AE1C2F1DE3B3.idx
/home/gym/.cache/clangd/index/Documentation.h.610F2C4895F543EA.idx


gym@gymDeskGentoo /usr/src/linux-5.4.97-gentoo $ sudo ls -la .cache/clangd/index|head
总用量 58700
drwxr-x--- 2 root root 380928  6月 10 09:15 .
drwxr-x--- 3 root root   4096  6月  9 16:18 ..
-rw-r--r-- 1 root root   5542  6月  9 19:29 6lowpan.h.6D849A4581F51D75.idx
-rw-r--r-- 1 root root  19466  6月 10 09:10 8250_core.c.03302A17DD1956D6.idx
-rw-r--r-- 1 root root   5922  6月 10 08:57 8250_dma.c.241F9EA320DAA6A7.idx
-rw-r--r-- 1 root root   9644  6月 10 08:27 8250_dw.c.7EEA4C8532E26DA7.idx
-rw-r--r-- 1 root root   2700  6月  9 19:32 8250_dwlib.c.AA97463F26264DE1.idx
-rw-r--r-- 1 root root    556  6月  9 19:32 8250_dwlib.h.50EB8DBE9DAC19FC.idx
-rw-r--r-- 1 root root   4284  6月  9 19:31 8250_early.c.A5E92A802B8BA462.idx

那个官方文档里有这么一句话,我不知道怎么理解:

With the -index-file option, clangd will load an index produced by the clangd-indexer tool.

我在进程列表里面找 clangd 进程,但命令行参数里面没有 -index-file ; 但我刚才关了 ~/.emacs 文件里面关于 rtags 的内容,的确 find-reference 还能找到其他文件里的引用:

好的,我关了rtags 再仔细测测,之前可能没测仔细,所以再装的rtags

更正: 手机敲字,自动把ccls给自动更正为 cycle了。。

我关了rtags 后,只用 lsp + clangd , 在 emacs 打开 clang 或 llvm 的源码,还是会在include 头文件下面标红;

而且,在 compile_commands.json 同目录下面也没发现有 .cache/clangd 子目录,前面我贴的内容里面 linux 内核源码目录下面是有这个子目录的,内部有索引文件。但这个索引问题和 include 头文件红色下划线可能其实是两个问题。

我在gentoo 论坛里面也发了个帖子问这事:Gentoo Forums :: View topic - any guide on review clang compiler source code in emacs?

老版本的clangd有好多问题,所以ccls的作者才写的ccls。要不试试ccls??

ccls的作者MaskRay也在论坛上,你搜搜帖子应该能找到好多;他的工作貌似是gcc llvm有关的,你看看它的配置,像llvm的头文件找不到之类的问题,应该都解决了。

您好,请问您的问题得到解决了吗?我也遇到了和您一样的问题,希望能够得到您的帮助。