- 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 ...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。