乐趣区

关于visual-studio-code:vscode设置C代码格式化ClangFormat

  • 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
    ...
退出移动版