1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html

# 模板格式,包括Google LLVM Chromium Mozilla Microsoft GNU等,如果设置为None表示不使用模板
BasedOnStyle: Google

# 格式化适用的语言
Language: Cpp

# 检查C++的构造是否兼容该版本
Standard: c++17

# 访问修饰符的缩进量,比如public或private等的位置,-4对应缩进的4个空格,就是不缩进
AccessModifierOffset: -4

# 开括号的对齐方式,即括号(包括小括号、花括号、尖括号)不在同一行时的对齐方式:
# - Align 表示换行情况下,换行的参数和开括号是对齐的
# - DontAlign 不对齐,而是使用配置的空格数
# - AlwaysBreak 永远换行,即第一个参数总不会紧跟着括号,总是换行,换行后按照配置的空格数对齐
# - BlockIndent 比AlwaysBreak多了一个操作,如果参数不固定在同一行,则闭括号会再换行到下一行
AlignAfterOpenBracket: Align

# 连续赋值语句的对齐方式,即多个赋值语句连续出现时的对齐策略,None表示不配置,若启用可以包含子配置项
AlignConsecutiveAssignments: None
# Enabled: false # 是否启用,启用时将上面不要填None
# AcrossEmtpyLines: false # 是否跨过空行
# AcrossComments: false # 是否跨过注释
# AlignCompound: false # 是否跨过复合语句
# PadOperators: true # (右)对齐赋值操作的操作符
# 同样控制连续对齐方式的还有下列几个,有着同样的子配置项
# AlignConsecutiveBitFields # 控制连续位定义语句出现时的对齐配置
# AlignConsecutiveDeclarations # 是否对齐连续声明,子配置项中还可以单独配置函数声明或指针声明对齐
# AlignConsecutiveMacros # 对齐宏定义

# 是否参数放不下时换行下一行
AllowAllArgumentsOnNextLine: true

# 构造函数的初始化列表的格式化
# - Never 始终将每个构造函数初始化器放在单独的一行
# - BinPack 紧凑排列
# - CurrentLine 如果能在一行放下则全部放在当前行,否则每个初始化器各占一行
# - NextLine 和CurrentLine类似,但如果当前行放不下,尝试全放在下一行
# - NextLineOnly 如果下一行能放下就全放在下一行,否则每个初始化器单独一行
PackConstructorInitializers : CurrentLine

# 是否允许所有函数声明的入参全部放在下一行
AllowAllParametersOfDeclarationOnNextLine: false

# 控制短的代码块放在同一行
# - Never 不会将短代码块合并到同一行
# - Empty 只会合并空的代码块
# - Always 总是将短代码块合并到一行
AllowShortBlocksOnASingleLine: Empty

# 是否将短case标签合并到同一行
AllowShortCaseLabelsOnASingleLine: false

# 控制短函数是否合并到同一行
# - None 不会将函数合并到一行
# - InlineOnly 会将内联的函数合并到同一行,但是不会合并空函数
# - Empty 只将空函数合并
# - Inline 会将内联函数合并到同一行,包括空函数
# - All 所有的短函数都会合并到同一行
AllowShortFunctionsOnASingleLine: Inline

# 控制短的判断分支合并到同一行
# - Never 不会合并
# - WithoutElse 如果没有else才会合并
# - OnlyFirstIf 仅将短的if语句放在同一行,不包括else if或else语句
# - AllIfAndElse 总是合并
AllowShortIfStatementsOnASingleLine: Never # To avoid conflict, set this "Never" and each "if statement" should include brace when coding

# 短lambda表达式的格式化方式,同短函数类似,有None Empty Inline All选项
AllowShortLambdasOnASingleLine: Inline

# 允许短的循环放在同一行
AllowShortLoopsOnASingleLine: false

# 返回类型后的代码格式化风格
# - Automatic 基于PenaltyReturnTypeOnItsOwnLine设置决定是否换行
# - ExceptShortType 短的类型不换行,其他同上
# - All 总是在返回类型后换行
# - TopLevel 只有顶层函数的返回类型后会换行
# - AllDefinitions 所有函数定义的返回类型后换行
# - TopLevelDefinitions 只有顶层函数的定义的返回类型后换行
BreakAfterReturnType: Automatic

# 模板声明后的格式化风格
# - Leave 不改变声明前的换行
# - No 不强迫在声明前换行
# - MultiLine 当后续的声明有多行时强制换行
# - Yes 始终换行
BreakTemplateDeclarations: Yes

# 函数参数使用紧凑布局
BinPackArguments: true

# 花括号格式化风格,
# - Attach 花括号紧跟着上下文
# - Linux 和Attach类似,但是函数,命名空间和类的定义时花括号会换行
# - Mozilla 花括号会在枚举、函数和声明时换行
# - Stroustrup 会在函数定义,catch和else换行
# - Allman 总是换行
# - Custom 自定义,每种情况的格式化风格由BraceWrapping配置
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterStruct: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false

# 对齐操作数
# DontAlign 禁用对齐
# Align 启用所有二元运算符的操作数对齐
# AlignAfterOperator 当设置了BreakBeforeBinaryOperators且一条语句中的运算符换行时,会将运算符对齐
AlignOperands: Align

# 二元运算符的换行方式
# - None 在运算符后换行
# - NonAssignment 在非赋值运算符前换行
# - All 所有运算符前换行
BreakBeforeBinaryOperators: None

# 允许在三元运算符前换行
BreakBeforeTernaryOperators: true

# 构造初始化列表的换行风格
# - BeforeColon 在冒号前和逗号后换行
# - BeforeComma 在冒号和逗号前换行
# - AfterColon 在冒号和逗号后换行
BreakConstructorInitializers: BeforeColon

# 继承列表换行风格
# - BeforeColon 在冒号前和逗号后换行
# - BeforeComma 在冒号和逗号前换行,并且将冒号和逗号对齐
# - AfterColon 在冒号和逗号后换行
# - AfterComma 只在逗号后换行
BreakInheritanceList: BeforeColon

# 列宽限制
ColumnLimit: 100

# 是否将连续的命名空间紧凑排列在同一行
CompactNamespaces: false

# 换行后的位移量
ContinuationIndentWidth: 4

# 是否适应最佳的C++11初始化列表风格(前后无空格)
Cpp11BracedListStyle: true

# 智能分析指针和引用符号的风格习惯
DerivePointerAlignment: false # Make sure the * or & align on the left

# 指针*和引用&的对齐位置,有Left, Right, Middle三个选项
PointerAlignment: Left

# 在访问修饰符前的空行风格
# - Never 删除访问修饰符前的所有空行
# - Leave 保持当前存在的空行
# - LogicalBlock 当访问修饰符开启了一个新的逻辑块时在前面添加一个空行
# - Always 总是在前面添加一个空行,除非在类的开头
EmptyLineBeforeAccessModifier: LogicalBlock

# 修复命名空间丢失的闭括号
FixNamespaceComments: true

# 控制#include块的排序
# - Presever 为每个分离的#include块排序
# - Merge 将#include块合并到一起排序
# - Regroup 将#include块合并到一起排序,然后再基于IncludeCategories重新分组
IncludeBlocks: Preserve

# case标签是否缩进
IndentCaseLabels: true

# 预处理指令的缩进风格
# - None 不进行缩进
# - AfterHash 在#后缩进
# - BeforeHash 在#前缩进
IndentPPDirectives: None

# 缩进宽度
IndentWidth: 4

# 根据MaxEmptyLinesToKeep的设置格式化空行
KeepEmptyLines :
AtEndOfFile: true
AtStartOfBlock: true
AtStartOfFile: false

# 最大空行数
MaxEmptyLinesToKeep: 1

# 命名空间缩进方式
# - None 不缩进
# - Inner 只有内部的命名空间会缩进
# - All 始终缩进
NamespaceIndentation: None

# 重新格式化注释
# - Never 不修改注释
# - IndentOnly 只适用缩进规则,不改变注释内部的格式
# - Always 适用缩进规则,并尝试将注释适应列长度限制
ReflowComments: Never

# 分离声明块,包括class、struct、enum和函数
# - Leave 保持当前格式
# - Always 始终在连续的声明间插入空行
# - Never 删除所有声明间的空行
SeparateDefinitionBlocks: Always # Only support since clang-format 14

# 是否在C风格类型转换后添加空格
SpaceAfterCStyleCast: false

# 是否在逻辑非后添加空格
SpaceAfterLogicalNot: false

# 是否在template关键字后添加空格
SpaceAfterTemplateKeyword: true

# 是否在赋值运算符前添加空格
SpaceBeforeAssignmentOperators: true

# 是否在初始化列表前添加空格
SpaceBeforeCpp11BracedList: false

# 是否在构造初始化的冒号前添加空格
SpaceBeforeCtorInitializerColon: true

# 是否在继承冒号前添加空格
SpaceBeforeInheritanceColon: true

# 定义哪些情况下在左括号前添加空格
# - ControlStatements 只在for/if/while等控制分支关键字后
# - ControlStatementsExceptControlMacros 在上述的基础上排除FOREACH宏
# - NonEmptyParentheses 只有在非空的判断条件下
# - Always 总是添加空格
# - Custom 自定义,通过SpaceBeforeParensOptions控制各种情况
SpaceBeforeParens: Custom
SpaceBeforeParensOptions:
AfterControlStatements: false
AfterForeachMacros: false
AfterFunctionDeclarationName: false
AfterFunctionDefinitionName: false
AfterIfMacros: false
AfterOverloadedOperator: false
AfterPlacementOperator: false
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false

# 范围循环的冒号前是否有空格
SpaceBeforeRangeBasedForLoopColon: true

# 方括号前是否有空格
SpaceBeforeSquareBrackets: false

# 空括号内是否有空格
SpaceInEmptyParentheses: false

# 行尾注释前的空格数
SpacesBeforeTrailingComments: 1

# 模板参数列表的空格风格
# - Never 尖括号内前后没有空格
# - Always 尖括号内总是有空格
SpacesInAngles: Never

# 控制“(”后和“)”前是否插入空格
# - Never 不插入
# - Custom 自定义,通过SpacesInParensOptions控制
SpacesInParens: Never

# 适用Tab键缩进的宽度
TabWidth: 4

# 在生成的文件中使用制表符字符的方式
# - Never 不使用制表符字符
# - ForIndentation 只在缩进时使用制表符
# - ForContinuationAndIndentation 在续行和缩进时使用制表符
# - AlignWithSpaces 在缩进和续行时使用制表符,在需要对齐的地方使用空格
# - Always 尽可能多的使用制表符
UseTab: Never