目前使用 emacs 开发一个 c++ 项目,项目本身有一个 .clang-format 文件用于格式控制,例如缩进=4空格;
emacs 安装了 lsp-mode,但是感觉写起来格式好奇怪:
不知道我少设置了哪目前使用 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)
补个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相近,可以一个一个地去试了
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缩进的文章,
多谢。
经过大佬的文章指导,使用 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