vscode 的格式化代码能力来源于插件(有不止一种插件提供格式化功能),而非 vscode 本身
这个可以通过卸载插件试出来,卸载到了某一个插件之后就无法格式化了,就是那个插件提供的格式化
商店搜索 clang-format,第一个下载多的
Releases · llvm/llvm-project · GitHub
可以直接把这个 exe 解压,里面有个 bin 目录,bin 目录有个 clang-format.exe (就要这个文件)
vscode——设置——拓展——clang-format
如果不配置 clang-format.exe 路径,格式化代码就会报错
The 'clang-format' command is not available. Please check your clang-format.executable user setting and ensure it is installed.
格式化部分代码:选中部分代码,ctrl + k , ctrl + f
格式化所有代码:shift + alt + f 或者右键代码空白处,有个格式化代码选项
右键代码空白位置,还是上图,有个 使用...格式化文档 ,点进去可以设置默认格式化的插件,如果你有多个格式化插件,点击配置默认格式化程序,然后请选择 Clang-Format,如果只有一个格式化插件,可忽略此步骤
设置——拓展——clang-format,这里可以选择一些别人定好的样式,比如:LLVM
如果不需要个性化设置,那么到这就结束了
格式化的个性化设置可以通过指定 .clang-format 文件位置来配置,设置右上角,点击红框处,打开设置的 json 文件 ( .clang-format 文件的优先级高于第六章的别人定好的样式)
然后追加一行 ( file: 不可以省略),后面接 .clang_format 文件的具体路径
"clang-format.style": "file:C:\\Users\\AA\\Documents\\clang-format\\.clang-format"
# 反斜杠也是可以的
# "clang-format.style": "file:C:/Users/AA/Documents/clang-format/.clang-format"
示例:
官方有提供 .clang_format 文档说明
Clang-Format Style Options — Clang 18.0.0git documentation
或者参考其他博主
clang-format 最全格式说明_.clang-format-CSDN博客
值得一提的是 .clang_format 这个文件应该是一种通用的格式,很多插件都支持配置这个文件的路径
简单聊聊怎么看官方文档和 .clang_format 文件编写,首先 .clang_format 是一个 yaml 格式,比如
---
# We'll use defaults from the LLVM style, but with 4 columns indentation.
BasedOnStyle: LLVM
IndentWidth: 4
---
Language: Cpp
# Force pointers to the type for C++.
DerivePointerAlignment: false
PointerAlignment: Left
---
Language: JavaScript
# Use 100 columns for JS.
ColumnLimit: 100
---
Language: Proto
# Don't format .proto files.
DisableFormat: true
---
Language: CSharp
# Use 100 columns for C#.
ColumnLimit: 100
可以先看看 yaml 文件的基础知识,有点像 key: value 的结构
Yaml文件的基础知识 - 知乎
然后说说要注意的点
①、yaml 大小写敏感,这个建议是复制官方文档的字段,不容易出错
②、冒号后面必须有个空格,然后别用中文冒号
BasedOnStyle: LLVM
# 下面这种是错的
BasedOnStyle:LLVM
③、--- 三个横杠用于分割块,块中的 key 值不能重复(插一句别的,上面示例中三个横杠分割了不同语言的格式化设置,第一个块应该是全局配置)
④、缩进敏感,类似 python,因为没有括号分隔,全靠缩进,所以别乱缩进
⑤、关于 value,几种常见值
#第一种 key: value
SpacesBeforeTrailingComments: 3
#第二种 key: key: value
AlignConsecutiveMacros:
Enabled: true
AcrossEmptyLines: true
AcrossComments: false
#第三种 key: 数组
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
官方文档的格式名是按照字母排序的
Clang-Format Style Options — Clang 18.0.0git documentation
①、样例1,常规类型
红框代表 key 字段,绿框代码 value 的类型,像整型、布尔大家应该认识,最后那个 clang-format 3.3 是 clang-format.exe 的版本,如果下的最新版可无须关心
AccessModifierOffset: 2
②、样例2,枚举类型,也可以认为是一个字符串
绿框里是一个自定义类型,可选的值为 in configuration 后面的红框里的值,别看成 BAS_Align
AlignAfterOpenBracket: Align
③、样例3,复合类型
这种就还是以文档内容为主,文章说提供了两种写法,一种是 key: value,一种是 key: key: value,以实际文档为主
# 方式一
AlignConsecutiveMacros: Consecutive
# 方式二
AlignConsecutiveMacros:
Enabled: true
然后大家结合全文翻译就能自己写 .clang_format 文件了
其实下面 BasedOnStyle 里面就是一个大的格式集合,我们只需要找到我们不习惯的格式,单独拎出来改就行,不用每个格式都配置
---
BasedOnStyle: LLVM
IndentWidth: 4
---
Language: Cpp
# 列限制,超过这个列数才折行,这个值低的话很容易自动折行
ColumnLimit: 150
# 空行分割块,比如两个相邻的结构体,中间自动加个空行
SeparateDefinitionBlocks: Always
# 结构体数组阵列,右对齐,描述有点抽象,建议看官方文档
AlignArrayOfStructures: Right
我只配置了限制自动折行的列数,他们有个智能折行的操作,有时候没几列就折行了,我就调高一点这个列限制列数
然后就是分割块,有时候我们两个结构体离得很近,就中间自动插入一个空格,函数和函数之间也属于块的范畴,处理也是同理,我理解大括号里面的可能都叫做块
最后一个配置像这样
// 左对齐
struct test demo[] =
{
{56, 23, "hello"},
{-1, 93463, "world"},
{7, 5, "!!" }
};
// 右对齐
struct test demo[] =
{
{56, 23, "hello"},
{-1, 93463, "world"},
{ 7, 5, "!!"}
};