在 eglot 中使用 ccls

ccls 支持一些方便代码阅读的 lsp 扩展,包括更全面的 call hierarchy, member hierarchy 等功能,具体可以参考 lsp mode · MaskRay/ccls Wiki · GitHub

但是想要在 emacs 中使用这些功能需要安装 emacs-ccls 和 lsp-mode 。而自从 eglot 合并到 master 后我就打算从 lsp-mode 迁移到 eglot ,为了在 eglot 中使用 ccls 的这些功能,我 fork 了一份 emacs-ccls ,将其他依赖 lsp-mode 的实现替换成了 eglot 的接口。

整体适配过程并不复杂,只是机械的替换相应实现。已经完成的部分包括我常用的 call hierarchy, type hierarchy 和 member hierarchy 。其他的功能像 semantic highlight 由于能力有限暂时还有问题所以无法正常使用。有能力的人或许可以自己尝试适配一下。

https://git.sr.ht/~zhscn/eglot-ccls

放几个已经完成的截图: call hierarchy

type hierarchy

member hierarchy

8 个赞

你用的哪个字体?

是 PragmataPro 。

1 个赞

您好,新的llvm编译的ccls似乎有点bug,但是不确定是server的问题还是client的问题(我倾向于server的问题): 在ccls的源码文件clang_tu.cc中53行,StringRef这个类型无法解析到,但是改成llvm::StringRef就可以了,你有碰到这个问题吗? 我的llvm version: 14.06 印象里大概是llvm13或者14之后有的问题

没有遇到过你描述的问题,可能是 coompile_commands.json 的问题,或许可以尝试下重新生成 database。

我是cmake生成compile_commands.json文件的,这里应该没有问题,而且它加上llvm::就好了,看起来更像是搜索命名空间的问题;

请问你用的是哪个版本的llvm,就是ccls --version输出的那个。

我用的master分支,两天前的 a5f8a36d0298b4e5f608b760c4d84f6d3e5c3251

我拿vscode试了试,也有这个问题,那估计是clang的某个已修复问题。