*
vscode中只要安装了C/C++扩展后,在C/C++源文件中右键就能看到格式化文档的选项,这样就能通过该选项或者其快捷键(Shift+Alt+F)来实现快速格式化代码。
*
安装了C/C++扩展同时会自动安装clang-format,通过配置.clang-format文件可以对代码格式化进行一些自己的设置。这样就可以按照自己的设置来进行一键格式化了。
* 在vscode首选项中有一些相关设置。
* C_Cpp: Clang_format_style 决定格式化形式,若为file,则调用在workspace中的.clang-format
* C_Cpp: Clang_format_fallback Style ,若上一个选项设置为file,但无.clang-format文件则按照此处规则
* 我是通过vscode的remote
ssh远程登录到linux虚拟机上,我虚拟机中的clang-format在/root/.vscode-server/extensions/ms-vscode.cpptools-1.8.4/LLVM/bin文件夹中,所以cd到该目录下执行命令——
./clang-format -style=LLVM -dump-config > .clang-format
就能生成.clang-format文件。将该文件拷贝到自己项目中,然后按照自己的需求修改配置就可以了。
* 其中.clang-format文件生成命令的格式是: // 格式名可选:LLVM, Google, Chromium, Mozilla,
WebKit。 clang-format -style=格式名 -dump-config > .clang-format
* 以下是我自定义的格式化配置,仅供参考。 --- # 语言: None, Cpp, Java, JavaScript, ObjC, Proto,
TableGen, TextProto Language: Cpp # BasedOnStyle: LLVM #
访问说明符(public、private等)的偏移 AccessModifierOffset: -4 # 开括号(开圆括号、开尖括号、开方括号)后的对齐:
Align, DontAlign, AlwaysBreak(总是在开括号后换行) AlignAfterOpenBracket: Align # 对齐数组列
AlignArrayOfStructures: None # 对齐连续宏定义 AlignConsecutiveMacros: None #
连续赋值时,对齐所有等号 AlignConsecutiveAssignments: None # 对齐连续位字段
AlignConsecutiveBitFields: None # 连续声明时,对齐所有声明的变量名
AlignConsecutiveDeclarations: None # 左对齐逃脱换行(使用反斜杠换行)的反斜杠 AlignEscapedNewlines:
Left # 水平对齐二元和三元表达式的操作数 AlignOperands: Align # 对齐连续的尾随的注释
AlignTrailingComments: true # 允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine: true # 允许短的枚举放在同一行
AllowShortEnumsOnASingleLine: true # 允许短的块放在同一行 AllowShortBlocksOnASingleLine:
Never # 允许短的case标签放在同一行 AllowShortCaseLabelsOnASingleLine: false # 允许短的函数放在同一行
AllowShortFunctionsOnASingleLine: All # 允许短的匿名函数放在同一行
AllowShortLambdasOnASingleLine: All # 允许短的if语句保持在同一行
AllowShortIfStatementsOnASingleLine: Never # 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine: false # 总是在返回类型后换行 AlwaysBreakAfterReturnType:
None # 总是在多行string字面量前换行 AlwaysBreakBeforeMultilineStrings: false #
总是在template声明后换行 AlwaysBreakTemplateDeclarations: MultiLine AttributeMacros: -
__capability # false表示函数实参要么都在同一行,要么都各自一行 BinPackArguments: true #
false表示所有形参要么都在同一行,要么都各自一行 BinPackParameters: true #
大括号换行,只有当BreakBeforeBraces设置为Custom时才有效 BraceWrapping: AfterCaseLabel: false
AfterClass: false AfterControlStatement: Never AfterEnum: false AfterFunction:
false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false
AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: false
BeforeLambdaBody: false BeforeWhile: false IndentBraces: false
SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true #
在二元运算符前换行 BreakBeforeBinaryOperators: None # 在concept前换行
BreakBeforeConceptDeclarations: true # 在大括号前换行: Attach(始终将大括号附加到周围的上下文)
BreakBeforeBraces: Attach # 继承列表样式 BreakInheritanceList: AfterComma # 在三元运算符前换行
BreakBeforeTernaryOperators: true # 构造函数初始值设定项换行样式
BreakConstructorInitializers: BeforeComma # 在java字段的注释后换行
BreakAfterJavaFieldAnnotations: false # 每行字符的限制,0表示没有限制 ColumnLimit: 80 #
描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变 CommentPragmas: '^ IWYU pragma:' #
在新行上声明每个命名空间 CompactNamespaces: false # 构造函数的初始化列表的缩进宽度
ConstructorInitializerIndentWidth: 4 # 延续的行的缩进宽度 ContinuationIndentWidth: 4 #
去除C++11的列表初始化的大括号{后和}前的空格 Cpp11BracedListStyle: true # 继承最常用的换行方式
DeriveLineEnding: true # 继承最常用的指针和引用的对齐方式 DerivePointerAlignment: false # 关闭格式化
DisableFormat: false # 删除访问修饰符后的所有空行 EmptyLineAfterAccessModifier: Never #
仅当访问修饰符开始一个新的逻辑块时才添加空行 EmptyLineBeforeAccessModifier: LogicalBlock #
自动检测函数的调用和定义是否被格式为每行一个参数(Experimental) ExperimentalAutoDetectBinPacking: false
# 自动补充namespace注释 FixNamespaceComments: true # 需要被解读为foreach循环而不是函数调用的宏
ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IfMacros: - KJ_IF_MAYBE #
多个#include块合并在一起并排序为一个 IncludeBlocks: Merge # 可以定义负数优先级从而保证某些#include永远在最前面
IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2
SortPriority: 0 CaseSensitive: false - Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3 SortPriority: 0 CaseSensitive: false - Regex: '.*' Priority: 1
SortPriority: 0 CaseSensitive: false IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: '' # 缩进访问修饰符 IndentAccessModifiers: false # 缩进case标签
IndentCaseLabels: false # case 标签后面的块使用与 case 标签相同的缩进级别 IndentCaseBlocks: false
# 缩进goto标签。 IndentGotoLabels: false # 缩进预处理器指令 IndentPPDirectives: None #
向后兼容缩进外部块 IndentExternBlock: AfterExternBlock # 缩进模板中的requires子句
IndentRequires: false # 缩进宽度 IndentWidth: 4 # 函数返回类型换行时,缩进函数声明或函数定义的函数名
IndentWrappedFunctionNames: false # 插入尾随逗号 InsertTrailingCommas: None #
保留JavaScript字符串引号 JavaScriptQuotes: Leave # 包装 JavaScript 导入/导出语句
JavaScriptWrapImports: true # 保留在块开始处的空行 KeepEmptyLinesAtTheStartOfBlocks: true
# 相对于 lambda 签名对齐 lambda 主体 LambdaBodyIndentation: Signature # 开始一个块的宏的正则表达式
MacroBlockBegin: '' # 结束一个块的宏的正则表达式 MacroBlockEnd: '' # 连续空行的最大数量
MaxEmptyLinesToKeep: 1 # 命名空间的缩进 NamespaceIndentation: Inner
ObjCBinPackProtocolList: Auto # 使用ObjC块时缩进宽度 ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true # 在ObjC的@property后添加一个空格
ObjCSpaceAfterProperty: false # 在ObjC的protocol列表前添加一个空格
ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60 PenaltyIndentedWhitespace: 0 # 指针的对齐: Left,
Right, Middle PointerAlignment: Left # 缩进预处理器语句的列数 PPIndentWidth: -1 # 引用的对齐
ReferenceAlignment: Pointer # 允许重新排版注释 ReflowComments: true # 短命名空间跨越的最大展开行数
ShortNamespaceLines: 1 # 允许排序#include SortIncludes: CaseSensitive #
java静态导入放在非静态导入之前 SortJavaStaticImport: Before # 对using声明排序
SortUsingDeclarations: true # 在C风格类型转换后添加空格 SpaceAfterCStyleCast: false #
在!后添加空格 SpaceAfterLogicalNot: false # 在Template关键字后添加空格
SpaceAfterTemplateKeyword: true # 在赋值运算符之前添加空格 SpaceBeforeAssignmentOperators:
true # 不在case冒号之前添加空格 SpaceBeforeCaseColon: false # 不在C++11大括号列表之前添加空格
SpaceBeforeCpp11BracedList: false # 在构造函数初始化器冒号之前添加空格
SpaceBeforeCtorInitializerColon: true # 在继承冒号前添加空格 SpaceBeforeInheritanceColon:
true # 开圆括号之前添加一个空格: Never, ControlStatements, Always SpaceBeforeParens:
ControlStatements # 不要确保指针限定符周围有空格,而是使用 PointerAlignment
SpaceAroundPointerQualifiers: Default # 在基于范围的for循环冒号之前添加空格
SpaceBeforeRangeBasedForLoopColon: true # {}中间不添加空格 SpaceInEmptyBlock: false #
在空的圆括号中添加空格 SpaceInEmptyParentheses: false # 在尾随的评论前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 1 # 在尖括号的<后和>前添加空格 SpacesInAngles: Never #
不在if/for/switch/while条件周围插入空格 SpacesInConditionalStatement: false #
在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格 SpacesInContainerLiterals: true #
在C风格类型转换的括号中添加空格 SpacesInCStyleCastParentheses: false #
行注释开头允许有多少个空格。要禁用最大值,请将其设置为-1,除此之外,最大值优先于最小值 SpacesInLineCommentPrefix:
Minimum: 1 Maximum: -1 # 在圆括号的(后和)前添加空格 SpacesInParentheses: false #
在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响 SpacesInSquareBrackets: false #
不在[前添加空格 SpaceBeforeSquareBrackets: false # 位域:每边都添加空格 BitFieldColonSpacing:
Both # 标准 Standard: Auto # 在语句前面被忽略的宏定义,就好像它们是一个属性一样
StatementAttributeLikeMacros: - Q_EMIT # 应该被解释为完整语句的宏定义 StatementMacros: -
Q_UNUSED - QT_REQUIRE_VERSION # tab宽度 TabWidth: 4 # 使用\n换行 UseCRLF: false #
使用tab字符:ForIndentation——仅将制表符用于缩进 UseTab: ForIndentation # 对空格敏感的宏定义
WhitespaceSensitiveMacros: - STRINGIZE - PP_STRINGIZE - BOOST_PP_STRINGIZE -
NS_SWIFT_NAME - CF_SWIFT_NAME ...