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 文件找不到。
mxi1
2
lsp需要一个后端(比如clangd
, cquery
,ccls
等)来解析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配置也许对你有参考作用。
mxi1
9
不好意思,没看清你的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
mxi1
12
更正: 手机敲字,自动把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?
mxi1
14
老版本的clangd有好多问题,所以ccls的作者才写的ccls。要不试试ccls??
ccls的作者MaskRay也在论坛上,你搜搜帖子应该能找到好多;他的工作貌似是gcc llvm有关的,你看看它的配置,像llvm的头文件找不到之类的问题,应该都解决了。
您好,请问您的问题得到解决了吗?我也遇到了和您一样的问题,希望能够得到您的帮助。