Emacs中c++-ts-mode与eglot(clangd)配合时缩进异常求助
修复Emacs中c++-ts-mode与eglot(clangd)配合时的缩进异常问题
以下是几种可行的修复方案,可逐一尝试:
1. 统一本地缩进与clangd格式化规则
clangd的格式化逻辑依赖项目根目录的.clang-format配置,若与Emacs本地缩进设置不一致,会导致缩进冲突。
- 在项目根目录创建
.clang-format文件,写入匹配你设置的规则:BasedOnStyle: Linux IndentWidth: 4 TabWidth: 4 UseTab: Never - 确保c-ts-mode的配置与上述规则对齐,你的现有配置中
c-ts-mode-indent-offset 4和c-ts-mode-indent-style 'linux已经符合,可移除cc-mode中针对c-basic-offset的设置(若仅使用c-ts-mode编辑C++文件),避免配置混淆。
2. 调整eglot自动格式化触发时机
回车时eglot的自动格式化可能与Emacs本地缩进逻辑冲突,可修改eglot配置:
- 禁用输入时的自动格式化,仅保留手动触发:
在eglot的:config块中添加:(setq eglot-auto-format nil) - 或改为仅在保存时自动格式化,添加钩子:
(add-hook 'c++-ts-mode-hook (lambda () (add-hook 'before-save-hook 'eglot-format-buffer nil t)))
3. 自定义c-ts-mode的回车缩进行为
重新绑定回车按键,确保仅触发本地缩进逻辑,避免与eglot冲突:
在c-ts-mode的:config块中添加:
(define-key c-ts-mode-map (kbd "RET") 'newline-and-indent) (setq c-ts-mode-auto-indent nil)
4. 排查其他插件干扰
若启用了aggressive-indent-mode等自动缩进类插件,可能与c-ts-mode、eglot冲突,可临时禁用测试:
(disable-local-variable 'aggressive-indent-mode)
内容的提问来源于stack exchange,提问作者Thysrael
相关产品推荐
相关产品推荐

