是的,但是就c/c++而言,其实这里只用到了编译器的前端。它的优点和局限性都来自于此。
对的,tags 建立索引就是不精确的,这一般是劣势(特别是 OOP 语言中),但在 (1)多语言 或 (2) 比较简单的语言如C 里,我觉得 tags 更好用。
(打一个可能不太恰当的比方就是 tags complete 但不 sound,LSP sound 但不 complete。)
那 lsp server 要提供精确的跳转就得分析 Makefile 了——目前还没人做这件事
为啥make 并不像cmake一样,加个参数生成 compile_commands.json 呢(如果compile_commands.json没问题得话)? 需要bear 这么“恐怖”的方法,当然,从演示以及促使用户学习一些高阶技巧的角度,bear是有价值的,虽然我这会儿还看不懂。
make 做的工作很单纯,没有项目的概念,也不理解什么叫 flags,也不理解用户写的 shell 到底是什么意思。
那 lsp server 要提供精确的跳转就得分析 Makefile 了——目前还没人做这件事
我搜到一个老帖子 clangd only indexed opened file · Issue #340 · clangd/clangd · GitHub , 里面描述的问题和我们讨论的类似,里面说可能是 gdkdndprivate.h 没有出现在compile_commands.json 里面,我grep 了一下,的确不在,但在 Makefile 里grep 也没有啊。 我理解某个用到 gdk/gdkdndprivate.h 的编译命令里可能包含了 -I…/gdk ,由此编译的时候在 …/gdk 目录里找到了 gdkdndprivate.h ,否则如何编译通过?既然编译通过,那个background indexer 应该把至少这么重要的definition 写在index里吧. 假如 background indexer 如果因为某种原因出问题了, 我就尝试下手工 clangd-indexer, 关键我还没找到这个文件,gentoo 下载的源码包里是有对应的 clang-tools-extra/clangd/indexer/IndexerMain.cpp, 但是我没找到build的结果,cmake, gentoo ebuild 这一块我也菜得很啊,先发个帖子问下 Gentoo Forums :: View topic - where is the clangd-indexer?
谢了,我下载,解压, 在compile_commands.json文件目录运行 ~/clangd_15.0.3/bin/clangd-indexer --executor=all-TUs compile_commands.json > clangd.dex
生成了索引。文档上要在说是要给 clangd 加个启动参数 -index-file=索引文件路径,但怎么在emacs 里给 clangd加这个启动参数呢?我 grep 发现 /home/guyuming/.emacs.d/elpa/lsp-mode-20220529.1330/lsp-clangd.el 里有些内容貌似相关,但不会改。
具体说,有
defcustom lsp-clients-clangd-args '("--header-insertion-decorators=0")
我是不是可以在启动配置里 set 一下,但语法怎么写呢?这上面代码引号外层怎么还有一层括号,我要在后面加参数,是加引号里呢还是在括号里面用逗号分开?
(更新:试错法,~/.emacs 末尾加了
(setq lsp-clients-clangd-args '("--header-insertion-decorators=0" "-index-file=/home/guyuming/gtk3+/gtk+-3.24.34/clangd.dex"))
在htop里面确实看到clangd命令行带了两个参数,但还是不能跳转,这下我又没方向了!先尝试下ccls吧
)
按 Configuration 里描述,在compile_commands.json 文件边上建了一个.clangd 文件, 但emacs里面_GdkDragContext还是无法跳转,也不知道如何验证索引有没有加载成功。
guyuming@localhost ~/gtk3+/gtk+-3.24.34 $ cat .clangd
Index:
External:
File: /home/guyuming/gtk3+/gtk+-3.24.34/clangd.dex
我笔记本比较慢,我ccls时,感觉卡顿得很厉害,不知是哪里配置不对还是咋的