请教 emacs 开发 c++ 项目缩进等如何控制

目前使用 emacs 开发一个 c++ 项目,项目本身有一个 .clang-format 文件用于格式控制,例如缩进=4空格;

emacs 安装了 lsp-mode,但是感觉写起来格式好奇怪:

不知道我少设置了哪

.clang-format只被clang-format工具或clangd(format provider也使用clang-format库);

Emacs编辑时的缩进,由c-basic-offset这个变量控制。如果有editorconfig插件和editorconfig配置文件的话,会影响这个变量的值,见editorconfig手册。

你用lsp 的format就跟.clang format一致了,要编辑时跟lsp format一致可以都用google风格,需要额外下载elisp的google style文件,其他自带的style不清楚clang format支持不

倒也不是最终 format 时候,就是在编辑的时候,他缩进之类的很奇怪

;;; c
(defun my-c-mode-hook ()
  "Only for c-mode tab 4"
  (interactive)
  (setq c-basic-offset 4
		c-indent-lelve 4
		c-default-style "bsd"
		backward-delete-char-untabify-method nil ;; for tab backward hitting from 4->1
		)
  )
(add-hook 'c-mode-common-hook 'my-c-mode-hook)
(add-hook 'c-mode-hook 'my-c-mode-hook)

;;; cpp
(defun my-cpp-mode-hook ()
  "Only for cpp-mode tab 4"
  (setq cpp-basic-offset 4
		cpp-indent-lelve 4
		cpp-default-style "bsd"
		backward-delete-char-untabify-method nil ;; for tab backward hitting from 4->1
		)
  )
(add-hook 'c++-mode-hook 'my-cpp-mode-hook)

1 个赞

补个Google 风格的官方链接:styleguide/google-c-style.el at gh-pages · google/styleguide · GitHub

也可以通过 melpa 安装,或者通过 Borg 或者 straight.el 直接从这个镜像安装:GitHub - emacsmirror/google-c-style: Google's C/C++ style for c-mode

另外请问下,如果 clang-format 用的 Microsoft风格,Emacs 有没有相应的设置包?

好像都在c-style-alist里呀,用这个代码打印下:

(cl-dolist (style c-style-alist)
  (message (car style)))

输出是:

google   // 这个就是google c style
cc-mode
user
gnu
k&r
bsd
stroustrup
whitesmith
ellemtel
linux
python
java
awk

不知道哪个跟Microsoft相近,可以一个一个地去试了 :joy:

Google 风格好弄,安装好以后加个 hook 就可以了。

(add-hook 'c-mode-common-hook 'google-set-c-style)

试下来,stroustrup 风格比较接近Microsoft,但还有一些不一致,看来还是得自己微调。如果有现成的包就省事一些。

嗯嗯,实际测试编辑时google style跟clangd格式化后还是会有些许差别的,开了format on save + auto-save-visited-mode(1秒间隔) 就能体会到,我现在是关了format on save,看格式不舒服了手动Alt+F8(lsp-format-buffer)

我也是写好以后手动再用 clang-format 格式化,但希望emacs 在编辑的时候,缩进和 clang-format 一致。特别是修改代码的时候,不一致的话,就很难受。

c-basic-offset 这个参数现在还有用吗?我感觉好像现在cc-mode不用了

以前我写过如何微调C++/Java缩进的文章,

1 个赞

多谢。 经过大佬的文章指导,使用 M-x c-set-offset 调试(光标放在需要调整的行),同时参考 c-offsets-alist 这个变量的说明,以及c-style-alist变量中列出的内置风格设置,已经可达到我的需求了。

目前使用下面的配置 + clang-format 的 Microsoft 风格

  (c-add-style "microsoft"
               '("stroustrup"
                 (c-offsets-alist
                  (access-label . /)
                  (innamespace . -)
                  (inline-open . 0)
                  (inher-cont . c-lineup-multi-inher)
                  (arglist-cont-nonempty . +)
                  (template-args-cont . +))))
  (setq c-default-style "microsoft")

.clang-format:

# clang-format configuration  -*- mode: yaml -*-

# Visual Studio style
BasedOnStyle: Microsoft
;;AccessModifierOffset: -4
ColumnLimit: 0

# custom setting
Language: Cpp
# 在圆括号的"("后和")"前添加空格
SpacesInParentheses: true
1 个赞