如何在Flycheck及Emacs LSP-Mode中配置Clang检查器并生效.clang-tidy
解决Emacs中Flycheck+LSP-Mode下.clang-tidy不生效的问题
先确保clangd能正确识别.clang-tidy文件
- 检查文件位置:
.clang-tidy必须放在项目根目录——clangd默认会从当前打开的文件目录向上遍历,直到找到包含.git、CMakeLists.txt这类项目标识的目录,把它当作根。如果配置文件放在子目录,clangd大概率找不到。 - 手动指定项目根:如果clangd没自动识别到项目根,打开项目里的任意文件后,执行
M-x lsp-workspace-folders-add,选择你的项目根目录,再执行M-x lsp-restart-workspace重启LSP服务。
强制clangd加载配置文件
直接给clangd添加启动参数,确保它启用配置文件支持。在Emacs配置文件里添加:
(setq lsp-clients-clangd-args '("--clang-tidy" "--enable-config"))
--clang-tidy用于开启clang-tidy检查,--enable-config会强制clangd读取项目中的.clang-tidy配置。
直接忽略特定警告(如果.clang-tidy还是不生效)
如果上面的方法没解决,你可以直接在Emacs层面配置忽略指定警告:
方法1:通过clangd启动参数添加忽略规则
比如要忽略unused-variable警告,修改启动参数:
(setq lsp-clients-clangd-args '("--clang-tidy" "--enable-config" "-Wno-unused-variable"))
把-Wno-<警告名>换成你要忽略的警告即可。
方法2:通过Flycheck禁用特定检查器
如果是Clang静态分析器的特定检查器要禁用,比如clang-analyzer-core.NullDereference,可以配置:
(setq flycheck-clang-analyzer-disabled-checkers '( "clang-analyzer-core.NullDereference" "clang-analyzer-deadcode.DeadStores" ))
把里面的检查器名称换成你需要禁用的。
方法3:给单个项目配置(不影响全局)
在项目根目录创建.dir-locals.el文件,写入以下内容(以C/C++模式为例):
((c++-mode . ((lsp-clients-clangd-args . ("--clang-tidy" "--enable-config" "-Wno-unused-variable")))) (c-mode . ((lsp-clients-clangd-args . ("--clang-tidy" "--enable-config" "-Wno-unused-variable")))))
这样只有这个项目会用这些配置,不会干扰其他项目。
验证配置是否生效
- 重启Emacs后打开项目文件,执行
M-x lsp-clangd-show-config,查看输出里是否包含你的.clang-tidy配置内容。 - 写一段会触发你要忽略的警告的代码,看Flycheck是否还会标记该警告。
内容的提问来源于stack exchange,提问作者shodanex
相关产品推荐
相关产品推荐

