lsp-mode:ccls or clangd?

年轻人估计无法想象老一輩 emacs 用户写代码连高亮都不用开(

大神就在坛子里

我的项目用clangd怎么补全跳转都有问题,好多符号找不到,用ccls就没问题

1 个赞

功能好像还挺全面的

我也没用过这两个😄,好像是多年不更新了。
还是用 LSP 方便一些。

追问一下,我看emcas-lsp repo下除了lsp-mode外还有一个叫emacs-ccls的mode,他们俩都是lsp的client吗,只不过后者为了ccls设计的?

emacs-ccls 依赖于lsp-mode,支持C++的客户端

我能理解成,功能更专一(c++)的lsp客户端吗

当年的 font-lock 真的太差了,即使有 lazy-lock 也没法用

font-lock是什么?

就是语法高亮啊

为啥叫这个名字?

不为啥,排版术语

ccls的作者佛系维护,目前只是保证ccls可以在最新版的LLVM下编译成功,但是实现了很多写c++很有用的扩展,具体可以看wiki。clangd的补全速度比ccls快,补全的项目比ccls多一点(绝大部分时候ccls也不差什么,而且clangd的补全花里胡哨的 :rofl:),而且有一些比如自动引入头文件、高亮buffer中的代码、内置clang-tidy等实用功能。讲道理,前几年ccls对比clangd还是有很多杀手级的特性优势,现在随着clangd的不断完善两者的基本没有差距了,用哪个属于个人体验和癖好的范畴。

1 个赞

有可能是你的代码用到了较高的C++版本,默认好像是用的 C++11。

可以在项目目录下建立一个 .clangd 文件,并添加配置来启用更高版本的 C++ 标准。详细设置可以参考clangd的官方文档

比如我要启用 C++ 20 标准, 可以在 .clangd 文件中加入以下内容:

CompileFlags:                     # Tweak the parse settings
  Add: [-std=c++20]             # treat all files as C++, enable more warnings
  Compiler: clang++               # Change argv[0] of compile flags to `clang++`

1 个赞

我的经验ccls比clangd快的多 (eglot + ccls, working on linux kernel),而且jump to reference什么的稳定很多,特别是在有non-self contained header上目前clangd完全无法处理,ccls有一些heuristic稍微好一点。

不过我自己的用法比较奇葩,我会把整个project都先用ccls index完才开始做事,所以参考性可能低一点。

BTW,您说clangd/ccls不符合要求,但是CEDET/Semantic可以,具体大概是什么情况呢?

很好奇你们 ccls 怎么用的? 编译导出的 compile_commands.json 只包含 cpp、cu 文件,然后我会用 compdb 把 header 也包进去,这样索引会全面些。

缺点是包进去了 header,索引会变慢,另外一个问题是最新的 lsp-mode 包,会默认开启 ref 功能,就是一个变量或者函数被索引了多少次,这时候编辑 header 文件巨卡…

应该是这个 lsp-lens-enable 变量控制的,关了就好

BTW,您说clangd/ccls不符合要求,但是CEDET/Semantic可以,具体大概是什么情况呢?

具体情况比较复杂,目前不方便解释。