Eglot: clangd配置
Eglot是Emacs内置的LSP客户端。Eglot内置已支持大量的LSP服务端1。
以C++语言为例,Eglot支持clangd和ccls两种服务端模式。
以我常用的clangd来说,Eglot默认启动clangd不附带任何参数,对于clangd来说,最重要的参数莫过于 CompilationDatabase ,即 compile_commands.json
文件所在的目录,默认情况下,clangd会查找源代码文件所在目录的所有父目录。
当前C/C++工程代码很流行使用CMake替代之前的Makefile作为编译构建的工程文件,通常使用CMake命令对代码工程进行配置时,会将生成的中间文件统一在一个目录下管理(比如代码工程根目录下的cmake-build目录),而不是默认生成在代码工程根目录,这样造成一个问题就是clangd无法找到此目录下的 compile_commands.json
文件。
解决这个问题的办法就需要在clangd启动时指定 compile_commands.json
所在的目录,方法有很多种。
(with-eval-after-load 'eglot (add-to-list 'eglot-server-programs `((c-mode c-ts-mode c++-mode c++-ts-mode objc-mode) . ("clangd" "--compile-commands-dir=cmake-build"))))
可以在emacs的配置中,修改默认LSP服务端的启动参数,但是每个工程所对应的目录可能不一样,这里无法做到统一。
此时就可以使用 .dir-locals.el
2 文件来对每个工程来配置。
((nil . ((eglot-server-programs . (((c-mode c-ts-mode c++-mode c++-ts-mode objc-mode) . ("clangd" "--compile-commands-dir=cmake-build")))))))
还有一种配置方法,就是clangd自身对应的配置文件,可以是clangd的全局配置文件 config.yaml
,也可以是每个工程对应的配置文件 .clangd
。一般我们会针对工程进行个性化配置。
CompileFlags: CompilationDatabase: "cmake-build"
Footnotes:
1
内置支持的LSP服务端参见eglot-server-programs参数。