My C/C++ Code Style settings based on Google
作者: tiandyoin
翻译日期: 2022.9.1
翻译版本: clang-format 14.0.6
英文原版: Clang 16.0.0git documentation - CLANG-FORMAT STYLE OPTIONS
https://clang.llvm.org/docs/ClangFormatStyleOptions.html
支持语言: None, Cpp, CSharp, Java, JavaScript, Json, ObjC, Proto, TableGen, TextProto, Verilog, apex, cuda, glsl, hlsl, proto3, typescript
支持风格: LLVM, Chromium, GNU, Google, Microsoft, Mozilla, WebKit
本文语言: YAML
---
# My C/C++ Code Style settings based on Google
# 作者: tiandyoin
# 翻译日期: 2022.9.1
# 翻译版本: clang-format 14.0.6
# 英文原版: Clang 16.0.0git documentation - CLANG-FORMAT STYLE OPTIONS
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
# 支持语言: None, Cpp, CSharp, Java, JavaScript, Json, ObjC, Proto, TableGen, TextProto, Verilog, apex, cuda, glsl, hlsl, proto3, typescript
# 支持风格: LLVM, Chromium, GNU, Google, Microsoft, Mozilla, WebKit
# 本文语言: YAML
# 说明: 完全禁用格式化
# 例1:
# // clang-format off 或者 /* clang-format off */
# // clang-format on 或者 /* clang-format on */
# 注释写在代码里,可以禁用两行之间的代码格式化
DisableFormat: false
# 说明: 使用基于某个组织的风格样式。
# 例1:
# BasedOnStyle: InheritParentConfig
# https://google.github.io/styleguide/cppguide.html
BasedOnStyle: Google
# 说明: 解析和格式化与此标准兼容的 C++ 结构。
# 类型: LanguageStandard
# 取值:
# LS_Cpp03 (文件配置项: C++03 )
# LS_Cpp11 (文件配置项: C++11 )
# LS_Cpp14 (文件配置项: C++14 )
# LS_Cpp17 (文件配置项: C++17 )
# LS_Cpp20 (文件配置项: C++20 )
# LS_Latest(文件配置项: Latest)
# LS_Auto (文件配置项: Auto ) 基于输入自动检测。
Standard: Auto
# 说明: 访问修饰符的缩进或凸出的字符数。
# 访问修饰符: public, private, protected...
# 类型: Integer
AccessModifierOffset: 2
# 说明: 在左圆括号后保持水平对齐。
# 类型: ArrayInitializerAlignmentStyle
# 这适用于圆括号(round brackets (parentheses))、尖括号(angle brackets)和方括号(square brackets)。
# 取值:
# BAS_Align (文件配置项: Align ) 第一个参数紧跟左圆括号,后面参数水平对齐第一个参数。
# BAS_DontAlign (文件配置项: DontAlign ) 不对齐,而是使用 ContinuationIndentWidth.
# BAS_AlwaysBreak (文件配置项: AlwaysBreak) 若参数不适合一行,将在左圆括号后换行。
# BAS_BlockIndent (文件配置项: BlockIndent) 如果参数不适合单行,则始终在左圆括号后换行。右圆括号将放置在新行上。注意: 该项当前只适用于圆括号。
AlignAfterOpenBracket: Align
# 说明: 当使用数组初始化Struct时,对齐数组每一列元素。
# 类型: ArrayInitializerAlignmentStyle
# 取值:
# AIAS_None (文件配置项: None ) 不对齐数组初始值设定项列。
# AIAS_Left (文件配置项: Left ) 对齐数组列并左对齐列。
# AIAS_Right (文件配置项: Right) 对齐数组列并右对齐列。
AlignArrayOfStructures: None
# 说明: 对齐连续的赋值运算符。
# 类型: AlignConsecutiveStyle
# 取值:
# None (单独项)保持原样。
# Consecutive (单独项)对齐连续多行。
# AcrossEmptyLinesAndComments (单独项)跨空行和跨注释对齐。
# AcrossEmptyLines: Boolean (团或单)跨空行对齐。
# AcrossComments: Boolean (团或单)跨注释对齐。
# Enabled: Boolean (团员项)对齐开关。
# AlignCompound: Boolean (团员项)+=, <<= 之类的复合赋值符是否与 = 对齐。
# PadOperators: Boolean (团员项)短赋值运算符左侧填充空格,使得与长赋值运算符等宽。
# 例1: 作为单独项使用。
# AlignConsecutiveAssignments: AcrossEmptyLines
# AlignConsecutiveAssignments: AcrossEmptyLinesAndComments
# 例2: Enabled 值若为 true, 则跨空行而不是跨注释对齐。
# AlignConsecutiveAssignments:
# Enabled: true
# AcrossEmptyLines: true
# AcrossComments: false
AlignConsecutiveAssignments:
Enabled: true
AcrossEmptyLines: true
AcrossComments: true
AlignCompound: true
PadOperators: true
# 说明: 对齐连续的位域分隔符(:)。
# 类型: AlignConsecutiveStyle
# 取值:
# None (单独项)保持原样。
# Consecutive (单独项)对齐连续多行。
# AcrossEmptyLinesAndComments (单独项)跨空行和跨注释对齐。
# AcrossEmptyLines: Boolean (团或单)跨空行对齐。
# AcrossComments: Boolean (团或单)跨注释对齐。
# Enabled: Boolean (团员项)对齐开关。
# AlignCompound: Boolean (团员项)+=, <<= 之类的复合赋值符是否与 = 对齐。
# PadOperators: Boolean (团员项)短赋值运算符左侧填充空格,使得与长赋值运算符等宽。
AlignConsecutiveBitFields: None
# 说明: 对齐连续的声明(变量名)。
# 类型: AlignConsecutiveStyle
# 取值:
# None (单独项)保持原样。
# Consecutive (单独项)对齐连续多行。
# AcrossEmptyLinesAndComments (单独项)跨空行和跨注释对齐。
# AcrossEmptyLines: Boolean (团或单)跨空行对齐。
# AcrossComments: Boolean (团或单)跨注释对齐。
# Enabled: Boolean (团员项)对齐开关。
# AlignCompound: Boolean (团员项)+=, <<= 之类的复合赋值符是否与 = 对齐。
# PadOperators: Boolean (团员项)短赋值运算符左侧填充空格,使得与长赋值运算符等宽。
AlignConsecutiveDeclarations: None
# 说明: 对齐连续的宏定义。
# 类型: AlignConsecutiveStyle
# 取值:
# None (单独项)保持原样。
# Consecutive (单独项)对齐连续多行。
# AcrossEmptyLinesAndComments (单独项)跨空行和跨注释对齐。
# AcrossEmptyLines: Boolean (团或单)跨空行对齐。
# AcrossComments: Boolean (团或单)跨注释对齐。
# Enabled: Boolean (团员项)对齐开关。
# AlignCompound: Boolean (团员项)+=, <<= 之类的复合赋值符是否与 = 对齐。
# PadOperators: Boolean (团员项)短赋值运算符左侧填充空格,使得与长赋值运算符等宽。
AlignConsecutiveMacros: None
# 说明: 对齐转义换行符(反斜杠)。
# 类型: EscapedNewlineAlignmentStyle
# 取值:
# ENAS_DontAlign (文件配置项: DontAlign) 不对齐。
# ENAS_Left (文件配置项: Left ) 尽可能向左对齐转义的换行符。
# ENAS_Right (文件配置项: Right ) 在最右边的列中对齐转义的换行符。
AlignEscapedNewlines: Left
# 说明: 水平对齐二目运算符和三目运算符的操作数。
# 类型: OperandAlignmentStyle
# 取值:
# OAS_DontAlign (文件配置项: DontAlign ) 不对齐。
# OAS_Align (文件配置项: Align ) 水平对齐操作数。设置 BreakBeforeBinaryOperators 时,运算符换行并与第一行的操作数对齐。
# OAS_AlignAfterOperator (文件配置项: AlignAfterOperator) 水平对齐操作符。设置 BreakBeforeBinaryOperators 时,运算符会缩进,导致无法对齐。
AlignOperands: Align
# 说明: 对齐行尾注释。
AlignTrailingComments: true
# 说明: 如果函数调用或括号内的初始化列表不适合一行,则允许将所有参数放在下一行,即使 BinPackArguments 为 false 时。
AllowAllArgumentsOnNextLine: true
# 说明: 此选项已弃用(deprecated)。请参阅 PackConstructorInitializers 的 NextLine。
AllowAllConstructorInitializersOnNextLine: true
# 说明: 如果函数声明不适合一行,即使 BinPackParameters 为 false, 也允许将函数声明的所有参数放到下一行。
AllowAllParametersOfDeclarationOnNextLine: true
# 说明: 简短语句块 {...} 的占行方式。
# 类型: ShortBlockStyle
# 取值:
# SBS_Never (文件配置项: Never ) 从不合并为一行。
# SBS_Empty (文件配置项: Empty ) 只合并空块。
# SBS_Always (文件配置项: Always) 总是合并为一行。
AllowShortBlocksOnASingleLine: Empty
# 说明: 是否将简短的 Case(in Switch) 分块压缩为一行。
AllowShortCaseLabelsOnASingleLine: false
# 说明: 是否将简短的枚举(Enum)定义压缩为一行。
AllowShortEnumsOnASingleLine: false
# 说明: 简短的函数(Function)定义的占行方式。
# 类型: ShortFunctionStyle
# 取值:
# SFS_None (文件配置项: None ) 从不合并为一行。
# SFS_Empty (文件配置项: Empty ) 仅合并空函数。
# SFS_InlineOnly (文件配置项: InlineOnly) 仅合并在类中定义的函数。不在类中的函数,即使为空函数也不合并。
# SFS_Inline (文件配置项: Inline ) 合并在类中定义的函数及合并空函数。
# SFS_All (文件配置项: All ) 合并所有函数。
AllowShortFunctionsOnASingleLine: Inline
# 说明: 简短的 if 语句的占行方式。
# “简短”的解释是 if 后面的语句没有包含在大括号{}内。
# 类型: ShortIfStyle
# 取值:
# SIS_Never (文件配置项: Never ) 从不合并为一行。
# SIS_WithoutElse (文件配置项: WithoutElse ) 仅当没有 else 分句时才将短 if 语句放在同一行。
# SIS_OnlyFirstIf (文件配置项: OnlyFirstIf ) 将 if 分句放在同一行,但不包括 else if 或 else 语句。if 分句包括 if (条件表达式) 和 执行语句。
# SIS_AllIfsAndElse (文件配置项: AllIfsAndElse) 所有if分句放在同一行,所有else if分句放在同一行,所有 else 分句放在同一行。
AllowShortIfStatementsOnASingleLine: WithoutElse
# 说明: 简短的 Lambda 表达式的占行方式。
# 类型: ShortLambdaStyle
# 取值:
# SLS_None (文件配置项: None ) 从不合并为一行。
# SLS_Empty (文件配置项: Empty ) 仅合并空的 Lambda 表达式。
# SLS_Inline (文件配置项: Inline) 仅 Lambda 表达式是函数的参数时才将Lambda 表达式放在同一行。
# SLS_All (文件配置项: All ) 合并所有 Lambda 表达式。
AllowShortLambdasOnASingleLine: Inline
# 说明: 是否将简短的循环语句 (while (true) continue;) 压缩为一行。
AllowShortLoopsOnASingleLine: false
# 已弃用(deprecated)
# 说明: 函数定义中返回类型的换行方式。
# 类型: DefinitionReturnTypeBreakingStyle
# 取值:
# DRTBS_None (文件配置项: None ) 返回类型自动单独一行。在指定值(PenaltyReturnTypeOnItsOwnLine)后换行。PenaltyReturnTypeOnItsOwnLine 指定允许同一行的最大列数。
# DRTBS_All (文件配置项: All ) 返回类型总是单独一行。
# DRTBS_TopLevel (文件配置项: TopLevel) 非类内部函数的函数定义返回类型总是单独一行。
AlwaysBreakAfterDefinitionReturnType: None
# 说明: 函数中返回类型的换行方式。包括 函数声明 和 函数定义。
# 类型: ReturnTypeBreakingStyle
# 取值:
# RTBS_None (文件配置项: None ) 返回类型自动单独一行。在指定值(PenaltyReturnTypeOnItsOwnLine)后换行。PenaltyReturnTypeOnItsOwnLine 指定允许同一行的最大列数。
# RTBS_AllDefinitions (文件配置项: AllDefinitions ) 仅 函数定义 开头的返回类型总是单独一行。
# RTBS_All (文件配置项: All ) 函数定义 和 函数声明 开头的返回类型总是单独一行。
# RTBS_TopLevelDefinitions (文件配置项: TopLevelDefinitions) 非类内部函数的 函数定义 开头的返回类型总是单独一行。
# RTBS_TopLevel (文件配置项: TopLevel ) 非类内部函数的 函数定义 和 函数声明 开头的返回类型总是单独一行。
# 确定:
# TopLevel 对非类(class)内部,namespace {} 内部、嵌套namespace {} 内部、其它非 {} 内部的函数均有效。
AlwaysBreakAfterReturnType: None
# 说明: 总是在多行字符串文字之前换行。
AlwaysBreakBeforeMultilineStrings: false
# 说明: 模板(Template)的换行方式。
# 类型: BreakTemplateDeclarationsStyle
# 取值:
# BTDS_Yes (文件配置项: Yes ) 模板声明总是换行。即 template <...> 之后总是换行。
# BTDS_No (文件配置项: No ) 模板声明从不换行。即 template <...> 之后从不换行。
# BTDS_MultiLine (文件配置项: MultiLine) 仅当其后声明跨越多行时,模板声明后才强制换行。
AlwaysBreakTemplateDeclarations: Yes
# 说明: 应被解析为属性/限定符而不是宏名的字符串数组。这对于语言扩展或静态分析器注释很有用。
AttributeMacros:
- __capability
# 说明: 函数调用中的参数(arguments)的"堆积占行(Bin-Pack)"方式。
# 类型: Boolean
# 取值:
# false: 函数调用中的参数要么都在同一行,要么各占一行。
# true: 函数调用中的参数挤满一行再换行。
BinPackArguments: false
# 说明: 函数中的参数(Parameters)的"堆积占行(Bin-Pack)"方式。包括 函数声明 和 函数定义。
# 类型: Boolean
# 取值:
# false: 函数声明或函数定义中的参数要么都在同一行,要么各占一行。
# true: 函数声明或函数定义中的参数挤满一行再换行。
BinPackParameters: false
# 说明: 位域分隔符(:)的空格填补方式。
# 类型:
# 取值:
# BFCS_Both (文件配置项: Both ) 分隔符左右各保留一个空格。
# BFCS_None (文件配置项: None ) 分隔符左右都去除空格。设置 AlignConsecutiveBitFields 项时除外。
# BFCS_Before (文件配置项: Before) 分隔符左边保留一个空格。
# BFCS_After (文件配置项: After ) 分隔符右边保留一个空格。设置 AlignConsecutiveBitFields 项时除外。
BitFieldColonSpacing: Both
# 说明: 二目运算符发生折行(wrap)时的换行方式。
# 类型: BinaryOperatorStyle
# 取值:
# BOS_None (文件配置项: BOS_None ) 在运算符之后换行。
# BOS_NonAssignment (文件配置项: BOS_NonAssignment) 在不是赋值的运算符之前换行。
# BOS_All (文件配置项: BOS_All ) 在运算符之前换行。
BreakBeforeBinaryOperators: None
# 说明: 大括号(Braces)的换行方式。
# 类型: BraceBreakingStyle
# 取值:
# BS_Attach (文件配置项: Attach ) 始终将大括号 { 和 } 附加到周围的上下文中。
# BS_Linux (文件配置项: Linux ) 与 Attach 类似, 但在函数(function)、命名空间(namespace)、类(Class)的大括号 { 之前换行。
# BS_Mozilla (文件配置项: Mozilla ) 与 Attach 类似,但在函数(function)、枚举(enum)和记录类型(record: e.g. Class、struct、union)的大括号 { 之前换行。
# BS_Stroustrup (文件配置项: Stroustrup ) 与 Attach 类似, 但在函数(function)、catch、else的大括号 { 之前换行。
# BS_Allman (文件配置项: Allman ) 始终在大括号 { 之前换行。
# BS_Whitesmiths (文件配置项: Whitesmiths) 与 Allman 一样,但总是缩进大括号 { 并将代码与大括号 { 对齐。
# BS_GNU (文件配置项: GNU ) 始终在大括号 { 之前换行,并缩进控制语句的大括号 { ,如 if、else、for、while、try、do、switch、case、default等。
# BS_WebKit (文件配置项: WebKit ) 与 Allman 一样,但在函数(function)的大括号 { 之前换行。
# BS_Custom (文件配置项: Custom ) 在 BraceWrapping 中配置每个单独的大括号的换行方式。
# 待定:
# 之前换行,之后换不换行?右大括号如何?
# Attach: do {} while(); 等,左大括号贴在同一行,右大括号贴在同一行。 if...else, try ... catch 等类似。
# Allman: 无法控制 typedef struct a {} a; // 隔行的a 会紧贴 }
BreakBeforeBraces: Custom
# 说明: 每个单独的大括号的换行方式,当 BreakBeforeBraces 设置为 BS_Custom 时生效。
# 类型: BraceWrappingFlags
# 取值:
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
# 说明: 控制语句中的大括号的换行方式。
# 控制语句如: if、else、for、while、try、do、switch、case、default...
# 类型: BraceWrappingAfterControlStatementStyle
# 取值:
# (BWACS_Never 文件配置项: Never ) 不在左大括号之前换行。
# (BWACS_MultiLine 文件配置项: MultiLine) 仅在多行控制语句后对左大括号换行。
# (BWACS_Always 文件配置项: Always ) 始终在左大括号之前换行。
AfterControlStatement: Never
AfterEnum: false
AfterExternBlock: false
AfterFunction: false
AfterNamespace: false
# 说明: 在ObjC 的定义,如接口(interfaces)、实现(implementations)的大括号之前换行。
# @autoreleasepool 和 @synchronized 块根据 AfterControlStatement 项换行。
# AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
# 说明: 是否空函数的左右大括号都单独一行。
SplitEmptyFunction: false
# 说明: 是否空记录类型(record: e.g. Class、struct、union)的左右大括号都单独一行。
SplitEmptyRecord: false
SplitEmptyNamespace: false
# 说明: Concept 声明的换行方式。
# 类型: BreakBeforeConceptDeclarationsStyle
# 取值:
# BBCDS_Never (文件配置项: Never ) 将模板(template)声明与 concept 保持在一行。
# BBCDS_Allowed (文件配置项: Allowed) 在模板(template)声明与 concept 之间换行是允许的。实际上取决于内容宽度限制、行宽限制和换行规则。
# BBCDS_Always (文件配置项: Always ) 始终在 concept 之前换行。
BreakBeforeConceptDeclarations: true
# 说明: 是否在类的继承列表的每个逗号(,)之前换行。
BreakBeforeInheritanceComma: true
# 说明: 是否在三目运算符(? 及 :)之前换行。
BreakBeforeTernaryOperators: true
# 说明: 构造函数(Constructor)初始化列表的分行方式。
# 类型: BreakConstructorInitializersStyle
# 取值:
# BCIS_BeforeColon (文件配置项: BeforeColon) 在构造函数初始化列表的冒号(Colon)之前和逗号(Comma)之后换行。
# BCIS_BeforeComma (文件配置项: BeforeComma) 在冒号(Colon)和逗号(Comma)之前换行并对齐冒号(Colon)和逗号(Comma)。
# BCIS_AfterColon (文件配置项: AfterColon ) 在冒号(Colon)和逗号(Comma)之后换行。
BreakConstructorInitializers: BeforeColon
# 说明: 在构造函数(Constructor)初始化列表的每个逗号(,)前换行。
BreakConstructorInitializersBeforeComma: false
# 说明: 类(Class)继承列表的分行方式。
# 类型: BreakInheritanceListStyle
# 取值:
# BILS_BeforeColon (文件配置项: BeforeColon) 在继承列表的冒号(Colon)之前和逗号(Comma)之后换行。
# BILS_BeforeComma (文件配置项: BeforeComma) 在冒号(Colon)和逗号(Comma)之前换行并对齐冒号(Colon)和逗号(Comma)。
# BILS_AfterColon (文件配置项: AfterColon ) 在冒号(Colon)和逗号(Comma)之后换行。
# BILS_AfterComma (文件配置项: AfterComma ) 仅在逗号(Comma)之后换行。
BreakInheritanceList: BeforeColon
# 说明: 字符串(String)的每一个字面量(Literal)都单独一行。
# 列1:
# "apple" "orange""banana" =>
# "apple"
# "orange"
# "banana"
BreakStringLiterals: false
# 说明: 列数限制。0表示无限制。
ColumnLimit: 0
# 说明: 在注释中使用正则表达式,特别用于表示当前行内容不应被分行或以其他方式更改。
# 该项要写在代码文件中。
# 类型: String
# 例1:
# CommentPragmas: '^ Comment pragma: keep'
# #include <vector> // Comment pragma: keep
# 把这个字符串写在注释里,该行不会被格式化。
CommentPragmas: ''
# 说明: 是否压缩命名空间(Namespaces)。
# 类型: Boolean
# 取值:
# false: 在新行上声明每个命名空间。
# true: 连续的命名空间声明将在同一行。
CompactNamespaces: false
# 说明: 已弃用(deprecated)
# 参阅: PackConstructorInitializers 的 CurrentLine.
ConstructorInitializerAllOnOneLineOrOnePerLine: false
# 说明: 构造函数(Constructor)初始化列表和继承(Inheritance)列表的缩进字符数。
ConstructorInitializerIndentWidth: 2
# 说明: 续行的缩进字符数。
ContinuationIndentWidth: 2
# 说明: 将大括号列表格式化为最适合 C++11 的大括号列表。
# 大括号内列表元组将紧贴大括号。
Cpp11BracedListStyle: true
# 说明: 分析并以文件中最常用的行尾(\r\n 或 \n)格式化文件。
# UseCRLF 仅在无法分析时用作后备选项。
DeriveLineEnding: false
# 说明: 分析并以文件中最常用的指针(Pointer *)或引用(Reference &)的对齐方式格式化文件。
# PointerAlignment 仅在无法分析时用作后备选项。
DerivePointerAlignment: false
# 说明: 定义何时在访问修饰符(e.g. public、protected、private)之后放置一个空行。
# EmptyLineBeforeAccessModifier 选项决定两个访问修饰符之间的空行数。
# 类型: EmptyLineAfterAccessModifierStyle
# 取值:
# ELAAMS_Never (文件配置项: Never ) 删除访问修饰符之后的所有空行。
# ELAAMS_Leave (文件配置项: Leave ) 在访问修饰符之后保留现有的空行。 MaxEmptyLinesToKeep 决定最多空行保留行数。
# ELAAMS_Always (文件配置项: Always) 总是访问修饰符之后添加空行。 MaxEmptyLinesToKeep 决定空行保留行数。
EmptyLineAfterAccessModifier: Leave
# 说明: 定义何时在访问修饰符(e.g. public、protected、private)之前放置空行。
# EmptyLineBeforeAccessModifier 选项决定两个访问修饰符之间的空行数。
# 类型: EmptyLineBeforeAccessModifierStyle
# 取值:
# ELBAMS_Never (文件配置项: Never ) 删除访问修饰符之前的所有空行。
# ELBAMS_Leave (文件配置项: Leave ) 在访问修饰符之前保留现有的空行。
# ELBAMS_Always (文件配置项: Always ) 总是访问修饰符之前添加空行,除非访问修饰符位于结构体(Struct)或类(Class)定义的开头。
# ELBAMS_LogicalBlock (文件配置项: LogicalBlock) 仅当访问修饰符开始新的逻辑块时才添加空行。逻辑块是一组一个或多个成员字段或函数。
EmptyLineBeforeAccessModifier: LogicalBlock
# 说明: 当为 true 时,检测函数调用和定义是否以每行一个参数进行格式化。
# 每个函数调用的参数排列方式可以是打包(bin-packed)、每行一个和不确定的。
# 如果不确定,例如完全在一行上,但需要做出决定,则clang format会分析输入文件中是否存在其它打包(bin-packed)用例,并相应采取行动。
# 注意: 这是一个实验选项,可能会消失或重命名。请勿在配置文件等中使用此选项。使用时请自行承担风险。
ExperimentalAutoDetectBinPacking: false
# 说明: 为较长的命名空间(Namespace)添加缺少的命名空间结尾注释并修复无效的现有注释。
# 最短行数由 ShortNamespaceLines 选项决定。
# 注意:低于此值的被视为短命名空间,即在一页内首尾可见,不需要加结尾注释。
FixNamespaceComments: true
# 说明: 应该被解析为 foreach 循环而不是函数调用(Function call)的宏数组。
# 类型: List of Strings
# 例1:
# ForEachMacros: ['FOREACH', 'RANGES_FOR', 'BOOST_FOREACH']
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
# 说明: 应该被解析为条件(conditional)而不是函数调用的宏数组。
# 类型: List of Strings
# 例1:
# IfMacros: ['if', 'BOOST_if', 'KJ_IF_MAYBE']
# KJ_IF_MAYBE: https://github.com/capnproto/capnproto/blob/master/kjdoc/tour.md#maybes
IfMacros: []
# 说明: 分类及排序多个 #include块(Blocks).
# 一个 #include块 是指由若干个连续无空行的 #include语句 组成的一个分块。
# 类型: IncludeBlocksStyle
# 取值:
# IBS_Preserve (文件配置项: Preserve) 分别对每个 #include 块进行排序。
# IBS_Merge (文件配置项: Merge ) 将多个 #include 块合并在一起并排序。
# IBS_Regroup (文件配置项: Regroup ) 将多个 #include 块合并在一起并排序,然后根据类别优先级分组。请参阅 IncludeCategories.
IncludeBlocks: Preserve
# 说明: 表示用于排序和分组 #include 块(Blocks)的类别(Categories)。
# 类型: List of IncludeCategories
# 模板:
# IncludeCategories:
# - Regex: '...'
# Priority: 0
# SortPriority: 0
# CaseSensitive: 1
# - Regex: '...'
# Priority: 1
# SortPriority: 1
# CaseSensitive: 0
# - ...
# 说明: 系统最终把所有 #includes 语句分成若干个 类别(Categories),一个 类别(Category) 即是一个 组(Group).
# 一个 组(Group) 由一个或多个 片段(-) 组成。这里我们把 片段(-) 也称为 Segment.
# Groups 之间有空行隔开, Group 里的 Segments 没有空行隔开。
# 一个 Segment 定义一套 ‘分组’ 和 ‘排序’ 的规则,用于筛选出若干行 #include 语句。
# 一个 Segment 包含4个字段: Regex, Priority, SortPriority, CaseSensitive.
# 字段:
# - Regex (正则表达式)
# Regex 字段是一个字符串,表示筛选 #include 语句的规则,支持 POSIX 扩展正则表达式:
# https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html
# 这些 正则表达式(Regex) 与 #include 的 <> 或 "" 里的内容尝试匹配。
# 每行 #include 语句按 Regx 的排列顺序,自上而下与每个 Regex 尝试匹配。
# 当第一次与某个 Regex 匹配成功时,把该行 #include 语句归入该 Regex 所在的 Segment.
# Priority (组间优先级)
# Priority 也叫 类别优先级,系统以 Priority 为标准对 Segments 进行分组(Grouping),
# 并且对所有 Groups 按 Priority 的大小递增排序(Sort).
# Priority 位于 Segment 中,表示当前 Segment 属于 Priority 指定的 Group.
# 如果两个 Segments 具有相同的 Priority, 则它们同属于一个 Group.
# 单行 #include 语句没有匹配任何 Regex 时,以 INT_MAX 为默认 Priority, 归入最后一个 Group.
# 主要分组(Main Group) 的 Priority 为 0, 表示把该组放在源文件的开头,请参阅: IncludeIsMainRegex.
# 如果想要某个 Group 放在文件最前面,可以设定负值 Priority.
# SortPriority (组内优先级)
# SortPriority 是 Group 内各个 Segment 的排序优先级。
# 当 IncludeBlocks = IBS_Regroup 时,系统对 Group 内的多个 Segments 按 SortPriority 的大小递增排序。
# 当不等于时,不考虑 Segment, 系统分别对每个 Group 内的多个 #include 语句按字典顺序排序。
# SortPriority 是可选字段,如果未设置,默认等同于 Priority.
# CaseSensitive (区分大小写)
# 每个 Regex 匹配默认为不区分大小写(No Case Sensitive).
# 例1:
# IncludeCategories:
# - Regex: "<^c/"
# Priority: 1
# SortPriority: 0
# CaseSensitive: true
# - Regex: "^<(a|b)/"
# Priority: 1
# SortPriority: 1
# - Regex: "^<(foo)/"
# Priority: 2
# - Regex: '.*'
# Priority: 3
# Input:
# #include "exe.h"
# #include <a/dee.h>
# #include <foo/b.h>
# #include <a/bee.h>
# #include <exc.h>
# #include <b/dee.h>
# #include <c/abc.h>
# #include <foo/a.h>
# output:
# #include <c/abc.h>
# #include <a/bee.h>
# #include <a/dee.h>
# #include <b/dee.h>
#
# #include <foo/a.h>
# #include <foo/b.h>
#
# #include <exc.h>
IncludeCategories: []
# 说明: 后缀(Suffixes)正则表达式(Regex),用于匹配相同前缀、不同后缀的源文件名,
# 与这些源文件名有相同前缀的 #include<头文件名> 将列入主要分组(Main Group)。
# 类型: String
# 取值:
# "" : 空串表示任意后缀。
# $ : 表示无后缀。
# 例1:
# 表示 a.h 将成为 a.c 和 a_test.c 的 #includes 分组中的 Main Group, Priority 为 0, 放在 a.c 和 a_test.c 的开头。
# IncludeIsMainRegex: "(_test)?$"
IncludeIsMainRegex: ''
# 说明: 正则表达式(Regex),表示非标准扩展名的文件可以成为源文件。
# 使该文件可以参与 IncludeIsMainRegex 规则的运算。 Regex 可以是 文件名+通配符等+扩展名 的形式。
# 默认情况下,扩展名为 .c、.cc、.cpp、.c++、.cxx、.m 或 .mm 时才将文件视为“主文件”,即源文件。
IncludeIsMainSourceRegex: ''
# 说明: 是否缩进访问修饰符(e.g. public、protected、private)。由 AccessModifierOffset 指定缩进字符数。
IndentAccessModifiers: true
# 说明: 是否缩进 case 定义块。
IndentCaseBlocks: false
# 说明: 是否缩进 case 标签。
IndentCaseLabels: true
# 说明: extern "c" 定义块的缩进。
# 类型: IndentExternBlockStyle
# 取值:
# IEBS_AfterExternBlock (文件配置项: AfterExternBlock) 大括号独立一行时缩进内容 (参阅: BraceWrapping.AfterExternBlock)。
# IEBS_NoIndent (文件配置项: NoIndent ) 不缩进大括号里的内容。
# IEBS_Indent (文件配置项: Indent ) 缩进大括号里的内容。
IndentExternBlock: AfterExternBlock
# 说明: 是否缩进 goto 的标签。
IndentGotoLabels: true
# 说明: 缩进预处理指令的方式。
# 类型:
# 取值:
# PPDIS_None (文件配置项: None ) 不缩进预处理指令。
# PPDIS_AfterHash (文件配置项: AfterHash ) 在 # 后缩进指令。缩进字符数请参阅: PPIndentWidth.
# PPDIS_BeforeHash (文件配置项: BeforeHash) 在 # 前缩进指令。
IndentPPDirectives: AfterHash
# 说明: 是否缩进 requires 语句。
# 仅 RequiresClausePosition 为 OwnLine 或 WithFollowing 时生效。
# 版本: 15.0.0
# IndentRequiresClause: false
IndentRequires: false
# 说明: 缩进字符数。
IndentWidth: 2
# 说明: 是否缩进折行的函数名。
IndentWrappedFunctionNames: true
# 说明: 指定是否在控制语句之后插入大括号。
# 控制语句如: if、else、for、while、try、do、switch、case、default...
# 版本: 15.0.0
### InsertBraces: false
# 说明: 指定是否插入末尾逗号。
# 它目前仅适用于JavaScript。
# InsertTrailingCommas 不能与 BinPackArguments 一起使用,因为插入逗号将使"堆积占行(Bin-Pack)"方式失效。
# 类型: TrailingCommaStyle
# 取值:
# TCS_None (文件配置项: None ) 不插入末尾逗号,为默认值。
# TCS_Wrapped (文件配置项: Wrapped) 在跨多行换行的容器文字(数组和对象)中插入尾随逗号。
InsertTrailingCommas: None
# 说明: 是否在 { 块开始处保留空行。
KeepEmptyLinesAtTheStartOfBlocks: false
# 说明: lambda 表达式主体的缩进方式。
# 类型: LambdaBodyIndentationKind
# 取值:
# LBI_Signature (文件配置项: Signature ) 将 lambda 主体与 lambda 签名对齐。
# LBI_OuterScope (文件配置项: OuterScope) 将 lambda 主体与 lambda 签名所在的外部范围的缩进级别对齐。
LambdaBodyIndentation: Signature
# 说明: 匹配宏的开始块的正则表达式。
MacroBlockBegin: ''
# 说明: 匹配宏的结束块的正则表达式。
MacroBlockEnd: ''
# 说明: 要保留的最大连续空行数。
MaxEmptyLinesToKeep: 1
# 说明: 命名空间(Namespace)的内容部分的缩进方式。
# 类型: NamespaceIndentationKind
# 取值:
# NI_None (文件配置项: None ) 不缩进。
# NI_Inner (文件配置项: Inner) 缩进内层命名空间的内容(当有多重嵌套的命名空间时)。
# NI_All (文件配置项: All ) 缩进全部命名空间的内容。
NamespaceIndentation: None
# 说明: 应解析为命名空间名字的宏名列表。
# 类型: List of Strings
# 例1:
# #define NAMESPACE(name, version, ...) NS_ ## name ## _ ## version
# NamespaceMacros: [ 'NS_TESTSUITE_1', 'NS_BOOST_TEST_2' ] #//无法推导
# NamespaceMacros: [ 'NAMESPACE' ] #//无需推导
NamespaceMacros: []
# 说明: 构造函数(Constructor)初始化列表的"堆积占行(Bin-Pack)"方式。
# 类型:
# 取值:
# PCIS_Never (文件配置项: Never ) 每个初始化器单独一行。
# PCIS_BinPack (文件配置项: BinPack ) 多个初始化器堆积占行。
# PCIS_CurrentLine (文件配置项: CurrentLine) 如果合适全部放在当前行上,否则每个初始化器都单独一行。
# PCIS_NextLine (文件配置项: NextLine ) 如果不能全部放在构造函数一行上,尝试全部放在下一行,否则每个初始化器都单独一行。
PackConstructorInitializers: NextLine
# 说明: 有些情况下你会觉得怎么排版都达不到完美,只能各方面妥协一下(例如你限定了行宽,但注释想放宽松点允许超一些)。
# penalty 简单来说就是給每一次“违规”设定一个罚分, clang-format 帮你选择最终吃到的总罚分最少的策略。
# 参阅: https://www.itdaan.com/blog/2014/10/30/ffe4862b1459e999e6b726e2a355d103.html
# Penalty
# 说明: 赋值运算符因发生折行而换行的“违规”行为时的罚分。
# 当罚分设置比较高, clang-format将优先考虑不换行。
PenaltyBreakAssignment: 2
# 说明: 函数调用中因在第一个参数前发生折行而换行时的罚分。
PenaltyBreakBeforeFirstCallParameter: 1
# 说明: 因在每一行注释发生折行而换行时的罚分。
PenaltyBreakComment: 300
# 说明: 因在 << 前发生折行而换行时的罚分。
PenaltyBreakFirstLessLess: 120
# 说明: 因在开括号 '(' 后发生折行而换行时的罚分。
PenaltyBreakOpenParenthesis: 0
# 说明: 因一行字符串(String)的某一个字面量(Literal)发生折行而换行时的罚分。
PenaltyBreakString: 1000
# 说明: 因在模板(Template)声明后发生折行而换行时的罚分。
PenaltyBreakTemplateDeclaration: 10
# 说明: 指定对每个超出行限制字符数的字符的罚分。
# 一行的总罚分 = 超出字符数 * PenaltyExcessCharacter.
# 行限制字符数有多种情况: ColumnLimit、...
PenaltyExcessCharacter: 1000000
# 说明: 指定对每一个空格缩进字符的罚分(相对于前导的非空格列计算)。
PenaltyIndentedWhitespace: 0
# 说明: 指定函数返回类型单独一行的行为的罚分。
PenaltyReturnTypeOnItsOwnLine: 200
# 说明: 指针(Pointer *)的对齐方式。
# 类型: PointerAlignmentStyle
# 取值:
# PAS_Left (文件配置项: Left ) 指针向左紧贴类型。
# PAS_Right (文件配置项: Right ) 指针向右紧贴变量。
# PAS_Middle (文件配置项: Middle) 指针居中两边留空。
PointerAlignment: Left
# 说明: 预处理语句的缩进字符数。
# 当设置为 -1(默认)时, IndentWidth 也用于预处理器语句。
PPIndentWidth: -1
# 说明: 说明符和限定符的不同排列方式。
# 限定符(qualifiers)有: const, restrict, volatile, ...
# 说明符(specifiers)有: auto, constinit, consteval, constexpr, extern, final, inline, mutable, override, register, static, thread_local, ...
# 类型:
# 取值:
# QAS_Leave (文件配置项: Leave ) 保留原样(默认值)。
# QAS_Left (文件配置项: Left ) 将说明符/限定符更改为左对齐。
# QAS_Right (文件配置项: Right ) 将说明符/限定符更改为右对齐。
# QAS_Custom (文件配置项: Custom) 根据 QualifierOrder 项更改说明符/限定符的对齐方式。
QualifierAlignment: Custom
# 说明: 指定限定符出现的顺序。
# 类型: List of Strings
# 注意: 它必须包含“type”。 “type”左侧的项目将放置在类型的左侧并按提供的顺序对齐。
# “type”右侧的项目将放置在类型的右侧并按照提供的顺序对齐。
QualifierOrder: [ 'inline', 'static', 'type', 'const', 'volatile' ]
# 说明: 指定表示 原始字符串中支持的语言代码块 的格式。
# 原始字串字面量(Raw String Literals) 及包含它的语言 代码块(code blocks), 示例:
# <prefix>R"<delimiter>(<raw_string_literals>)<delimiter>"
# 注意! < 和 > 实际是不存在的,这里只是为了能区分开各个字段。
# clang-format 通过以上 包含形式 匹配代码中的字符串,并将它们重新格式化为指定语言(Language)的样式。
# 如果配置文件没有为指定语言定义样式,则使用"BasedOnStyle"的预定义样式。
# 如果未找到“BasedOnStyle”, 则格式化为基于"llvm"的样式。
# 匹配顺序 <Delimiters> 优先于 <Enclosing Functions>。
# 类型: List of RawStringFormats
# 取值:
# <raw_string_literals>: 原始字符串字面常量。
# 这样的字符串被 <prefix>R"<delimiter>( 和 )<delimiter>" 的代码块(code blocks)包裹起来。
# 字符串里的字符不使用转义,即是说 \ 反斜杠是一个普通的字符。 " 双引号也是普通字符,而不是用来包裹字符串。
# \n, \f, \t, \v, \s 等都被认为是两个字符。若要换行,那就换行,允许换行,只要被上面的代码块包裹即可。
# 定义这样的代码块,目的就是为了消除因'转义'带来的阅读困难。
# <prefix>: 前缀,用于声明字符串的字符类型,如: L, u8, u, U.
# 这里不需要用 <prefix> 来识别出 <Raw String Literals>,所以 clang-format 不给出这个类型。
# R: 在 C++ 里与 "( )" 结合,作为包裹 <Raw String Literals> 的代码块(code blocks)。
# <Delimiters>: 是指定界符,定界符默认为空。
# 当字面常量中有普通字串如 "( 和 )" , 这与 包含形式 重复,需要自定义 Delimiter 来区分边界。
# 定界符是一个不包含 空格、 控制字符、 (、 )、 \ 5种字符的普通字串。长度限制16个字符.
# "<delimiter> 及 <delimiter>" 不能再与字面常量中的字串有重复。
# <CanonicalDelimiter>: 规范定界符。如果指定了该值,在可能的情况下,同一语言的其他定界符将更新为规范值。
# <EnclosingFunctions>: 闭包函数, 即是函数里的函数。
# <Language>: 设定要格式成为哪种语言样式。
# <BasedOnStyle>: 指定语言格式失败后的备选样式。
# 例1:
# RawStringFormats:
# - Language: Cpp
# Delimiters:
# - cc
# - CC
# - cpp
# - Cpp
# - CPP
# - 'c++'
# - 'C++'
# CanonicalDelimiter: 'cc'
# BasedOnStyle: google
# - Language: TextProto
# Delimiters:
# - pb
# - PB
# - proto
# - PROTO
# EnclosingFunctions:
# - EqualsProto
# - EquivToProto
# - PARSE_PARTIAL_TEXT_PROTO
# - PARSE_TEST_PROTO
# - PARSE_TEXT_PROTO
# - ParseTextOrDie
# - ParseTextProtoOrDie
# - ParseTestProto
# - ParsePartialTestProto
# BasedOnStyle: llvm
# 原始串: "(fruit\apple)(fruit\banana)(fruit\bromel)"
# 转义串: \"(fruit\\apple)(fruit\\banana)(fruit\\bromel)\"
# Regex: \"\(fruit\\apple\)\(fruit\\banana\)\(fruit\\bromel\)\"
# 代码里: R"cc("(fruit\apple)(fruit\banana)(fruit\bromel)")cc"
# R"cpp("(fruit\apple)(fruit\banana)(fruit\bromel)")cpp"
# 由于设定了 CanonicalDelimiter, cpp 最终会被转换为 cc.
# 参阅: cpp11 "Raw string literals" 一节
# https://isocpp.org/wiki/faq/cpp11-language-misc
# https://en.cppreference.com/w/cpp/language/string_literal
# https://m.tw.llhlf.com/baike-C++11#新的字串字面值
# https://m.tw.llhlf.com/baike-字面常量_(C语言)
# https://www.codercto.com/a/67794.html
# 闭包函数: c++11的闭包(lambda、function、bind)
# https://blog.csdn.net/u010246947/article/details/80046365
# Python闭包(Closure)详解
# https://zhuanlan.zhihu.com/p/453787908
# go语言里的TextProto函数: PARSE_TEXT_PROTO(R"(...)");
# https://blog.csdn.net/feihe0755/article/details/122864884
RawStringFormats: []
# 说明: 引用(Reference &)的对齐方式。
# 类型: ReferenceAlignmentStyle
# 取值:
# RAS_Pointer (文件配置项: Pointer) 沿用 PointerAlignment。
# RAS_Left (文件配置项: Left ) 引用向左紧贴类型。
# RAS_Right (文件配置项: Right ) 引用向右紧贴变量。
# RAS_Middle (文件配置项: Middle ) 引用居中两边留空。
ReferenceAlignment: Pointer
# 说明: 指定是否在发生折行时重排注释。
ReflowComments: false
# 说明: 删除可选的控制语句大括号(if、else、for 和 while)。
RemoveBracesLLVM: true
# 说明: 指定 requires 语句的位置。
# 类型: RequiresClausePositionStyle
# 取值:
# RCPS_OwnLine (文件配置项: OwnLine ) 单独一行。
# RCPS_WithPreceding (文件配置项: WithPreceding) 尝试与前面部分的声明放在一行。
# RCPS_WithFollowing (文件配置项: WithFollowing) 尝试与后面部分的声明放在一行。
# RCPS_SingleLine (文件配置项: SingleLine ) 尝试将所有内容放在同一行。否则,正常的换行规则会接管。
### RequiresClausePosition: OwnLine
# 说明: 指定使用空行分隔不同定义块(e.g. class, struct, eunm, function)。
# 类型: SeparateDefinitionStyle
# 取值:
# SDS_Leave (文件配置项: Leave ) 保留原样。
# SDS_Always (文件配置项: Always) 插入空行。
# SDS_Never (文件配置项: Never ) 移除空行。
SeparateDefinitionBlocks: Leave
# 说明: 短命名空间跨越的最大非折行行数。
# 低于此值的被视为短命名空间。计算短命名空间的两个大括号 {} 内的部分, 不包括空行。
# 大括号单独一行时不计入此值。
ShortNamespaceLines: 30
# 说明: 指定是否以及怎样对头文件(#includes)列表排序。
# 类型:
# 取值:
# SI_Never (文件配置项: Never ) 从不排序。
# SI_CaseSensitive (文件配置项: CaseSensitive ) 按字母顺序或区分大小写的方式排序。
# SI_CaseInsensitive (文件配置项: CaseInsensitive) 按 ASCII 或不区分大小写的方式排序。
SortIncludes: Never
# 说明: 是否对 using 声明排序。
SortUsingDeclarations: false
# 说明: 是否在 C 风格类型转换后面留有一个空格。
SpaceAfterCStyleCast: false
# 说明: 是否在逻辑非运算符 (!) 之后留有一个空格。
SpaceAfterLogicalNot: false
# 说明: 是否在模板 (Template) 关键字之后留有一个空格。
SpaceAfterTemplateKeyword: true
# 说明: 在哪些情况下在指针(*)限定符之前或之后留有一个空格。
# 类型: SpaceAroundPointerQualifiersStyle
# 取值:
# SAPQ_Default (文件配置项: Default) 使用 PointerAlignment。
# SAPQ_Before (文件配置项: Before ) 确保指针前面有空格。
# SAPQ_After (文件配置项: After ) 确保指针后面有空格。
# SAPQ_Both (文件配置项: Both ) 确保指针前后有空格。
SpaceAroundPointerQualifiers: Default
# 说明: 赋值操作符前面是否有空格。
SpaceBeforeAssignmentOperators: true
# 说明: Case 语句的冒号(Colon)之前是否有空格。
SpaceBeforeCaseColon: false
# 说明: 在 C++11 的初始化列表的大括号之前是否有空格。
SpaceBeforeCpp11BracedList: false
# 说明: 构造函数(constructor)初始化列表的冒号(Colon)之前是否有空格。
SpaceBeforeCtorInitializerColon: true
# 说明: 类继承列表的冒号(Colon)之前是否有空格。
SpaceBeforeInheritanceColon: true
# 说明: 在哪些情况下在左圆括号(opening parentheses)前留有一个空格。
# 类型: SpaceBeforeParensStyle
# 取值:
# SBPO_Never (文件配置项: Never ) 不留空格。
# SBPO_ControlStatements (文件配置项: ControlStatements ) 控制语句关键字之后留空格。
# SBPO_ControlStatementsExceptControlMacros (文件配置项: ControlStatementsExceptControlMacros) 类似ControlStatements,不包括控制宏语句。
# SBPO_NonEmptyParentheses (文件配置项: NonEmptyParentheses ) () 之间非空,才在 ( 前留空格。
# SBPO_Always (文件配置项: Always ) 保持留有一个空格。
# SBPO_Custom (文件配置项: Custom ) 由 SpaceBeforeParensOptions 决定。
SpaceBeforeParens: Custom
# 说明: 每个单独的左圆括号(opening parentheses)前加空格的方式,当 SpaceBeforeParens 设置为 SBPO_Custom 时生效。
# 类型: SpaceBeforeParensCustom
# 取值:
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: false
AfterFunctionDeclarationName: false
AfterFunctionDefinitionName: false
AfterIfMacros: false
AfterOverloadedOperator: true
### AfterRequiresInClause: false
### AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
# 待定: 只有这9项?
# 说明: 范围形式的 for 之后左圆括号之前是否有空格。
SpaceBeforeRangeBasedForLoopColon: true
# 说明: 一个方括号 [ 前是否有空格。
# Lambdas 表达式不受影响。
SpaceBeforeSquareBrackets: false
# 说明: 是否在空块 {} 之中留有空格。
SpaceInEmptyBlock: false
# 说明: 是否在空块 () 之中留有空格。
SpaceInEmptyParentheses: false
# 说明: 是否在注释符 // 之后注释内容之前有空格。
SpacesBeforeTrailingComments: 2
# 说明: 尖括号 <> 里的留空方式。
# 类型: SpacesInAnglesStyle
# 取值:
# SIAS_Leave (文件配置项: Leave ) 如果存在任何空格,则在 < 之后和 > 之前保留一个空格。选项 Standard: Cpp03 优先。
# SIAS_Always (文件配置项: Always) 在 < 之后和 > 之前保留一个空格。
# SIAS_Never (文件配置项: Never ) 移除空格。
SpacesInAngles: Leave
# 说明: 是否在条件语句的圆括号里留有空格。
# 形式如: if( ... ), for( ... ), switch( ... ), while( ... )
SpacesInConditionalStatement: false
# 说明: 是否在字面量容器中插入空格(例如 OC和Javascript的数组和字典字面量)。
# 例1:
# true: false:
# var arr = [ 1, 2, 3 ]; vs. var arr = [1, 2, 3];
# f({a : 1, b : 2, c : 3}); f({a: 1, b: 2, c: 3});
SpacesInContainerLiterals: false
# 说明: 是否在 C 风格的类型强制转换的圆括号中留有空格。
# 例1:
# true: false:
# x = ( int32 )y vs. x = (int32)y
SpacesInCStyleCastParentheses: false
# 说明: 行注释开头允许有多少个空格。
# 要禁用最大值,请将其设置为 -1, 除此之外,最大值优先于最小值。
# 类型: SpacesInLineComment
# 取值:
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
# 说明: 是否在 ( 之前和 ) 之后插入空格。
SpacesInParentheses: false
# 说明: 是否在 [ 之前 和 ] 之后插入空格。
# 没有参数的 Lambdas 表达式和未指定大小的数组声明不受影响。
SpacesInSquareBrackets: false
# 说明: 指明某些类似变量声明前的类型应被解析为宏。
# 比如 Qts 里的宏 emit, 如果不指明,会被认为是类型(type), 像 int 等。
StatementAttributeLikeMacros: [ emit ]
# 说明: 表示应该被解析为完整语句的宏数组。
# 典型的宏是表达式,需要加分号;有时情况并非如此,这可以让 clang-format 了解这种情况。
StatementMacros: [ Q_UNUSED, QT_REQUIRE_VERSION ]
# 说明: 制表符占用的列数。
TabWidth: 2
# 说明: 指明某些宏不是函数调用,应被解析为类型声明。
# 例1
# typedef unsigned long long ULongLong
TypenameMacros: [ ULongLong ]
# 说明: 使用 \n 替换 \r\n 作为换行符。
# 作为 DeriveLineEnding 失效时的后备选项。
UseCRLF: false
# 说明: 在结果文件中使用制表符的方式。
# 类型:
# 取值:
# UT_Never (文件配置项: Never ) 从不使用Tab, 使用空格。
# UT_ForIndentation (文件配置项: ForIndentation ) 仅将制表符用于缩进。
# UT_ForContinuationAndIndentation (文件配置项: ForContinuationAndIndentation) 用制表符填充所有前导空白,并使用空格进行一行内出现的对齐(例如,连续的赋值和声明)。
# UT_AlignWithSpaces (文件配置项: AlignWithSpaces ) 使用制表符进行续行和缩进,使用空格进行对齐。
# UT_Always (文件配置项: Always ) 当我们需要填充至少从一个制表位到下一个制表位的空白时,请使用制表符。
UseTab: Never
# 说明: 指明对空格敏感且不应被更改的宏的数组。
# 例1:
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
---
Language: Cpp
Standard: Auto
---
Language: CSharp
Standard: Auto
---
Language: ObjC
Standard: Auto
# 说明: 大括号(Braces)的换行方式。
BreakBeforeBraces: Custom
# 说明: 每个单独的大括号的换行方式,当 BreakBeforeBraces 设置为 BS_Custom 时生效。
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterExternBlock: false
AfterFunction: false
AfterNamespace: false
# 说明: 在 ObjC 的定义,如接口(interfaces)、实现(implementations)的大括号之前换行。
# @autoreleasepool 和 @synchronized 块根据 AfterControlStatement 项换行。
AfterObjCDeclaration: true
AfterStruct: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
# 说明: 适用协议(protocol conformance)列表项的"堆积占行(Bin-Pack)"方式。
# 类型: BinPackStyle
# 取值:
# BPS_Auto (文件配置项: Auto ) 若 BinPackParameters 为true, 则按 Always 方式,否则按 Never 方式。
# BPS_Always (文件配置项: Always) 多个协议项堆积占行。
# BPS_Never (文件配置项: Never ) 每个协议项单独一行。
ObjCBinPackProtocolList: Never
# 说明: ObjC 块的缩进字符数。
ObjCBlockIndentWidth: 2
# 说明: 当函数调用中有嵌套块(nested block)参数时,将参数列表分到各独立行。
ObjCBreakBeforeNestedBlockParam: true
# 说明: 是否在 Objc @property 属性之后留有空格。
ObjCSpaceAfterProperty: false
# 说明: 是否在 Objc 协议列表前留有空格。
# <protocol1, protocol2>的 < 前留空格。
ObjCSpaceBeforeProtocolList: true
---
Language: Java
# 说明: 指定是否让每个注释字段独立一行。
# 注释字段: 以@开头的标签为 Javadoc 标记,由@和标记类型组成,缺一不可。
BreakAfterJavaFieldAnnotations: true
# 说明: 指定分组及排序 Jave 导入(import)语句的前缀字符串。
# 一个组的前缀可以是另一个组的子集,但总是匹配最长的前缀。
# 在一个组中, import 语句按字典顺序排列。
# 静态导入(import static)语句单独分组并遵循相同的分组规则。
# 默认情况下,静态 import 语句位于非静态 import 语句之前,但此行为由另一个选项 SortJavaStaticImport 更改。
JavaImportGroups: []
# 说明: 静态导入(import static)语句的排序方式。
# 类型: SortJavaStaticImportOptions
# 取值:
# SJSIO_Before (文件配置项: Before) 在非静态导入语句之前。
# SJSIO_After (文件配置项: After ) 在非静态导入语句之后。
SortJavaStaticImport: Before
---
Language: JavaScript
# 说明: JavaScript 字符串引号的样式。
# 类型:
# 取值:
# JSQS_Leave (文件配置项: Leave ) 保持原样。
# JSQS_Single (文件配置项: Single) 使用单引号。
# JSQS_Double (文件配置项: Double) 使用双引号。
JavaScriptQuotes: Leave
# 说明: JavaScript import 语句中的每个参数是否独立一行。
JavaScriptWrapImports: true
---
Language: Json
...
---
# [总结]
# 配置:
# 安装完 clang-format 扩展:"mjohns.clang-format"
# 之后安装 clang-format 15.0 可执行程序。
# https://github.com/llvm/llvm-project/releases
# 使用指南:
# https://blog.csdn.net/tiandyoin/article/details/126666447
# https://clang.llvm.org/docs/ClangFormat.html
# 生成C++配置: clang-format --style=Google --dump-config > ./.clang-format
# 生成Json配置: clang-format --style=Google --dump-config --assume-filename=.json > ./.google.json.clang-format
# 按json格式化: clang-format --style=file:${workspaceRoot}/.google.json.clang-format --assume-filename=.json xxx.jqq > xxx2.jqq
# --assume-filename=<string>:
# CSharp: .cs
# Java: .java
# JavaScript: .mjs .js .ts
# Json: .json
# Objective-C: .m .mm
# Proto: .proto .protodevel
# TableGen: .td
# TextProto: .textpb .pb.txt .textproto .asciipb
# Verilog: .sv .svh .v .vh
# 经测试, assumeFilename 有两个作用:
# (1)在输出配置文件时,给合本选项,确定输出配置文件的language.
# (2)在读取配置文件时,按后缀名分析取出相应的语言的配置部分来格式化代码。
# 如 "--assume-filename=.cs" 表示使用配置文件里的 language:CSharp 部分来格式化代码。
# 如果找不到 CSharp 部分会报错。没有给出该项时,默认 c++.
#
# 概念:
# 空行: 一行除了空白字符,没有其它可见字符(除了 \ )。 一行内前面是空白字符,最后是一个反斜杆,这一行也算空行。
# 一行:块注释(/*...*/),在做各种行数计算时,包括 /* 和 */ 在内,全部只算一行。
# 连续多行的行注释 //, 在做各种行数计算时,全部只算一行。
# 折行: 因为限制了一行的字符数,在超出字符数时,会把一行的代码拆成多行。这种情况叫折行。发生折行时一定会换行。
# 折行增加的行数不会计入各种有关行数的计算。
#
# 分类:
# 列对齐(\ , :),缩进 || 换行,折行,并行,空行,独行 || 增删改(空格,逗号,{},tab,注释) || 排序,分组 || 数量限制(列数, 缩进, 空行) || 分析(罚分, 解析)
# 记录类型: class, struct, enum, union
# 位域:
# 变量:
# 指针: *, &
# 常量: Raw String Literals
# 容器: array, string list
# 模板: Template, concept, requires, typename
# 函数: 构造函数
# Lambda: 闭包函数
# 关键字: extern, @protocol
# 修饰符: public, private, protected
# 限定符: const, restrict, volatile
# 说明符: auto, constinit, consteval, constexpr, extern, final, inline, mutable, override, register, static, thread_local, ...
# 类型: (type), (int), sizeof, typedef, typeid, _Alignof, _Alignas
# 运算符: ++, --, +, -, *, /, %, 二目, 三目
# 赋值符: =, +=, -=, *=, /=m, %=, ^=, &=, |=, ~=, ^=, <<=, >>=
# 逻辑符: !, &&, ||, &, |, ~,
# 比较符: ==, !=, <, >, <=, >=
# 操作符: <<, >>, ->, *, &, .
# 条件语句: if, else, while
# 控制语句: case, catch, goto
# 循环语句: for, while, foreach
# 预处理: #if, #include, import, using
# 作用域: namespace
# 宏:
# 注释:
# 其它: 行尾符, 制表符, (), [], {}, <>, \
...
[总结]
配置:
安装完 clang-format 扩展:“mjohns.clang-format”
之后安装 clang-format 15.0 可执行程序。
https://github.com/llvm/llvm-project/releases
使用指南:
https://blog.csdn.net/tiandyoin/article/details/126666447
https://clang.llvm.org/docs/ClangFormat.html
生成C++配置: clang-format --style=Google --dump-config > ./.clang-format
生成Json配置: clang-format --style=Google --dump-config --assume-filename=.json > ./.google.json.clang-format
按json格式化: clang-format --style=file:${workspaceRoot}/.google.json.clang-format --assume-filename=.json xxx.jqq > xxx2.jqq
–assume-filename=:
CSharp: .cs
Java: .java
JavaScript: .mjs .js .ts
Json: .json
Objective-C: .m .mm
Proto: .proto .protodevel
TableGen: .td
TextProto: .textpb .pb.txt .textproto .asciipb
Verilog: .sv .svh .v .vh
经测试, assumeFilename 有两个作用:
(1)在输出配置文件时,给合本选项,确定输出配置文件的language.
(2)在读取配置文件时,按后缀名分析取出相应的语言的配置部分来格式化代码。
如 “–assume-filename=.cs” 表示使用配置文件里的 language:CSharp 部分来格式化代码。
如果找不到 CSharp 部分会报错。没有给出该项时,默认 c++.
概念:
空行: 一行除了空白字符,没有其它可见字符(除了 \ )。 一行内前面是空白字符,最后是一个反斜杆,这一行也算空行。
一行:块注释(/…/),在做各种行数计算时,包括 /* 和 */ 在内,全部只算一行。
连续多行的行注释 //, 在做各种行数计算时,全部只算一行。
折行: 因为限制了一行的字符数,在超出字符数时,会把一行的代码拆成多行。这种情况叫折行。发生折行时一定会换行。
折行增加的行数不会计入各种有关行数的计算。
分类:
列对齐(\ , 😃,缩进 || 换行,折行,并行,空行,独行 || 增删改(空格,逗号,{},tab,注释) || 排序,分组 || 数量限制(列数, 缩进, 空行) || 分析(罚分, 解析)
记录类型: class, struct, enum, union
位域:
变量:
指针: *, &
常量: Raw String Literals
容器: array, string list
模板: Template, concept, requires, typename
函数: 构造函数
Lambda: 闭包函数
关键字: extern, @protocol
修饰符: public, private, protected
限定符: const, restrict, volatile
说明符: auto, constinit, consteval, constexpr, extern, final, inline, mutable, override, register, static, thread_local, …
类型: (type), (int), sizeof, typedef, typeid, _Alignof, _Alignas
运算符: ++, --, +, -, *, /, %, 二目, 三目
赋值符: =, +=, -=, *=, /=m, %=, ^=, &=, |=, ~=, ^=, <<=, >>=
逻辑符: !, &&, ||, &, |, ~,
比较符: ==, !=, <, >, <=, >=
操作符: <<, >>, ->, *, &, .
条件语句: if, else, while
控制语句: case, catch, goto
循环语句: for, while, foreach
预处理: #if, #include, import, using
作用域: namespace
宏:
注释:
其它: 行尾符, 制表符, (), [], {}, <>, \