VS Code自动格式化的实现

VS Code自动格式化的实现



前言

最近上了一节名为C++课程设计的课,在写屎山时遇到了许多问题:
没下VS Code(用的Code Blocks);
下了VS Code没空间下Qt(什么东西都往C盘下);
听说我已经把项目基础逻辑写完以后要自己单干的(不知道在想什么);
用一堆星号做游戏地图的(我就是很好奇怎么设置状态);
要交报告了还没写完自己单干的活的(天天看手机);
给老师验收完项目以后表示下次能不能用VS Code做图形化(不好说啥);
……
(这是一个正经学计算机的人能干出来的事吗?)


为什么要进行代码格式化

除以上问题之外,代码的排版有问题同样对低血压有很好的治疗效果,如:

fun1 () {
/* 内容 */
}       // 注释
fun_2()// 注释
{ /* 内容 */
}
Fun3(){
//     注释
    /* 内容 */}

这代码不像是给人看的,正常人也不会写这种恶心人的东西(不是人的另说)


前置条件

一、安装VS Code

我想能看到这篇文章的人应该会下载VS Code吧?

二、配置VS Code

配置C语言/C++请点击查看
配置Java请点击查看
配置Python请点击查看
配置其他语言请自行百度/CSDN/B站大学/博客园

三、下载插件

首先是Chinese插件(必选)
Chinese插件
然后是Clang-Format插件(必选)
Clang-Format插件
一个可下可不下的插件
Better Comments插件


配置环境

LLVM的下载

请自行上官网下载

LLVM安装教程

熟悉的界面
在这里插入图片描述
用户协议,不用看,也看不懂
在这里插入图片描述
一定要选择第二个或者第三个(默认是不添加环境变量的)(会添加环境变量的人也可以选择不点)
在这里插入图片描述
直接安装即可,否则下一步还要改文件路径
在这里插入图片描述

VS Code设置

打开设置,修改常用设置
(我相信各位都能找到设置)
这里的afterDelay就是自动保存
在这里插入图片描述
修改文本编辑器的格式化部分
在这里插入图片描述
找到我们下好的C语言扩展,修改以下内容(照着抄就行了)
执行路径为:
C:/Program Files/LLVM/bin/clang-format.exe
格式化文件路径为:
file:C:/Program Files/LLVM/bin/.clang-format
复制进去即可
在这里插入图片描述
在这里插入图片描述
Clang-Format的配置
同上
执行路径为:
C:/Program Files/LLVM/bin/clang-format.exe
格式化文件路径为:
file:C:/Program Files/LLVM/bin/.clang-format
复制进去即可
在这里插入图片描述
找到Clang-Format最后一个选项在这里插入图片描述


格式化文件

基于《Java开发手册(黄山版)》的格式设置

这本书里提及了许多代码的规范,有助于我们写出有些条理的屎山(建议全文背诵)
以下是我基于《Java开发手册(黄山版)》写的Clang-Format格式化文件(C语言和C++版本)
文件名设置成.clang-format(请打开查看文件扩展名,然后直接粘贴进去)
将设置好的文件移动到C:/Program Files/LLVM/bin这个位置
(不要问为什么没翻译完,问就是翻译不动)

# 语言
Language: Cpp
# C/C++/Java/JavaScript/Objective-C/Protobuf/C#/None 可选选项

# 基于的编码规范, 可选:
# - LLVM: https://llvm.org/docs/CodingStandards.html
# - Google: https://google.github.io/styleguide/cppguide.html
# - Chromium: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/styleguide/styleguide.md
# - Mozilla: https://firefox-source-docs.mozilla.org/code-quality/coding-style/index.html
# - WebKit: https://www.webkit.org/coding/coding-style.html
# - Microsoft: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
# - GNU: https://www.gnu.org/prep/standards/standards.html
# - InheritParentConfig: 继承父目录的编码规范, 如果有的话, 不是一个真正的编码规范
# - None: 不使用, 即自动配置, 也就是本文件中的自定义内容
BasedOnStyle: None

# 访问修饰符的缩进
AccessModifierOffset: -4

# 开括号后的对齐(包括小括号/大括号/尖括号), 建议使用Align
# - Align: 对于开括号,即在换行情况下, 换行的参数跟开括号对齐, 建议使用
# - DontAlign: 不对于开括号, 即换行时使用配置的空格数
# - AlwaysBreak: 永远换行, 即第一个参数都不允许粘连括号, 会强制换行, 换行后使用配置空格数对齐
# - BlockIndent: 同AlwaysBreak, 多了一个操作: 如果参数不固定在同一行, 闭括号将在下一行
AlignAfterOpenBracket: Align

# 在对结构数组使用初始化时,将字段对齐
# - None: 不做处理, 即保留开发者的代码
# - Left: 左对齐
# - Right: 右对齐
AlignArrayOfStructures: Left

# 连续赋值语句的对齐,即多个赋值语句连续出现时的对齐策略配置, 包含多个子配置项
AlignConsecutiveAssignments:
  # 是否启用, 建议不启用
  Enabled: false
  # 是否跨过空行, 即多个对齐语句中间有空行时, 是否跨过, 如果要开启连续赋值语句的配置, 建议为false
  AcrossEmptyLines: false
  # 同AcrossComments: 即是否跨过注释, 建议false
  AcrossComments: false
  # 是否跨过复合语句(包括空行及注释), 建议False
  AlignCompound: false
  # 函数指针是否一致
  AlignFunctionPointers: false
  # 是否(右)对齐赋值操作的操作符, 建议true
  PadOperators: true

# 对齐连续位字段的样式
AlignConsecutiveBitFields:
  Enabled: false
  AcrossEmptyLines: false
  AcrossComments: false
  AlignCompound: false
  AlignFunctionPointers: false
  PadOperators: false

# 对齐连续声明的样式
AlignConsecutiveDeclarations:
  Enabled: false
  AcrossEmptyLines: false
  AcrossComments: false
  AlignCompound: false
  AlignFunctionPointers: false
  PadOperators: false

# 对齐连续宏定义的样式
AlignConsecutiveMacros:
  Enabled: false
  AcrossEmptyLines: false
  AcrossComments: false
  AlignCompound: false
  AlignFunctionPointers: false
  PadOperators: false

# 对齐连续短case写标签的样式
AlignConsecutiveShortCaseStatements:
  Enabled: false
  AcrossEmptyLines: false
  AcrossComments: false
  AlignCaseColons: false

# 用于在转义换行符中对齐反斜杠的选项
AlignEscapedNewlines: Left

# 水平对齐二进制和三进制的操作数表达式
AlignOperands: Align

# 控制尾随注释
AlignTrailingComments:
  Kind: Never
  OverEmptyLines: 0

# 如果函数调用或支撑的初始值设定项列表不适合行,允许将所有参数放在下一行
AllowAllArgumentsOnNextLine: true

# 如果函数声明不适合一行,允许将函数声明的所有参数放在下一行
AllowAllParametersOfDeclarationOnNextLine: true

# 控制说明符之前是否可以有换行符
AllowBreakBeforeNoexceptSpecifier: Never

# 是否将短的代码块合并成一行
AllowShortBlocksOnASingleLine: Empty

# 是否将短的case标签合并为一行
AllowShortCaseLabelsOnASingleLine: false

# 是否允许在单行上提出短复合要求
AllowShortCompoundRequirementOnASingleLine: false

# 是否允许在一行上使用短枚举
AllowShortEnumsOnASingleLine: true

# 是否将短的函数、方法合并成一行
AllowShortFunctionsOnASingleLine: Empty

# 是否将短的if语句合并成一行
AllowShortIfStatementsOnASingleLine: Never

# 是否将短的lambda表达式合并成一行
AllowShortLambdasOnASingleLine: Empty

# 是否将短的循环语句合并成一行
AllowShortLoopsOnASingleLine: false

# 是否在多行字符串文本之前换行
AlwaysBreakBeforeMultilineStrings: false

AttributeMacros:
  - __capability

# 函数调用的实参是否位于同一行
BinPackArguments: true

# 函数调用的形参是否位于同一行
BinPackParameters: true

BitFieldColonSpacing: After

# 大括号是否换行
BraceWrapping:
  AfterCaseLabel: false
  AfterClass: false
  AfterControlStatement: Never
  AfterEnum: false
  AfterExternBlock: false
  AfterFunction: false
  AfterNamespace: false
  AfterObjCDeclaration: false
  AfterStruct: false
  AfterUnion: false
  BeforeCatch: false
  BeforeElse: false
  BeforeLambdaBody: false
  BeforeWhile: false
  IndentBraces: false
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false

# 相邻字符串文本之间的换行
BreakAdjacentStringLiterals: true

BreakAfterAttributes: Never

# * 是否在Java文件中对字段进行每次注释后换行(仅Java)
BreakAfterJavaFieldAnnotations: true

# * 是否应该 在元素之间添加换行符(仅Json)
BreakArrays: true

# 是否在二进制运算符前换行
BreakBeforeBinaryOperators: All

# 要使用的模板声明样式
BreakBeforeConceptDeclarations: Always

# 大括号是否换行
BreakBeforeBraces: Attach

# 要使用的内联ASM冒号样式
BreakBeforeInlineASMColon: OnlyMultiline

# 是否将三元运算符放在换行符之后
BreakBeforeTernaryOperators: true

# 要使用的构造函数初始值设定项样式
BreakConstructorInitializers: BeforeComma

# 要使用的继承列表样式
BreakInheritanceList: BeforeComma

# 是否在格式化时中断字符串文本
BreakStringLiterals: false

# 每行字符数限制
ColumnLimit: 150

# 描述具有特殊含义的注释的正则表达式, 不应拆分为几行或以其他方式更改
CommentPragmas: "^ IWYU pragma:"

# 是否将连续的命名空间声明放在同一行
CompactNamespaces: false

# 用于缩进构造函数的字符数,初始值设定项列表以及继承列表
ConstructorInitializerIndentWidth: 4

# 行延续的缩进宽度
ContinuationIndentWidth: 4

# 支持列表格式设置为符合C++11
Cpp11BracedListStyle: true

DerivePointerAlignment: false

# ! 是否完全禁用格式设置(慎用)
DisableFormat: false

# 定义何时在访问修饰符后放置空行
EmptyLineAfterAccessModifier: Never

# 定义何时在访问修饰符前放置空行
EmptyLineBeforeAccessModifier: LogicalBlock

# 添加缺少的命名空间结束注释 命名空间并修复无效的现有命名空间
FixNamespaceComments: true

# 应解释为循环的宏向量,而不是作为函数调用
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH

# 应解释为条件的宏向量,而不是作为函数调用
IfMacros:
  - KJ_IF_MAYBE

# 头文件排序
IncludeBlocks: Regroup

# 表示不同类别的正则表达式
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

# 指定后缀的正则表达式,该后缀允许在file-to-main-include映射
IncludeIsMainRegex: "(Test)?$"

# 为要格式化的文件指定正则表达式,被允许在file-to-main-include映射
IncludeIsMainSourceRegex: ""

# 指定访问修饰符是否应具有自己的缩进级别
IndentAccessModifiers: true

# 缩进case标签块
IndentCaseBlocks: true

# 缩进case标签
IndentCaseLabels: true

# 外部块的缩进类型
IndentExternBlock: Indent

# 缩进 goto 标签
IndentGotoLabels: true

# 要使用的预处理器指令缩进样式
IndentPPDirectives: AfterHash

IndentRequiresClause: true

# 缩进宽度
IndentWidth: 4

IndentWrappedFunctionNames: true

# 插入大括号
InsertBraces: true

InsertNewlineAtEOF: true

InsertTrailingCommas: None

IntegerLiteralSeparator:
  Binary: 0
  BinaryMinDigits: 0
  Decimal: 0
  DecimalMinDigits: 0
  Hex: 0
  HexMinDigits: 0

# 用于JavaScript字符串的格式
JavaScriptQuotes: Double

JavaScriptWrapImports: true

KeepEmptyLinesAtEOF: true

KeepEmptyLinesAtTheStartOfBlocks: true

LambdaBodyIndentation: Signature

LineEnding: CRLF

MacroBlockBegin: ""

MacroBlockEnd: ""

MaxEmptyLinesToKeep: 1

NamespaceIndentation: All

ObjCBinPackProtocolList: Auto

ObjCBlockIndentWidth: 4

ObjCBreakBeforeNestedBlockParam: true

ObjCSpaceAfterProperty: false

ObjCSpaceBeforeProtocolList: true

PackConstructorInitializers: Never

PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakScopeResolution: 500
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 60

PointerAlignment: Left

PPIndentWidth: -1

QualifierAlignment: Left

ReferenceAlignment: Pointer

ReflowComments: true

RemoveBracesLLVM: false

RemoveParentheses: MultipleParentheses

RemoveSemicolon: false

RequiresClausePosition: OwnLine

RequiresExpressionIndentation: OuterScope

SeparateDefinitionBlocks: Never

ShortNamespaceLines: 0

SkipMacroDefinitionBody: false

SortIncludes: CaseInsensitive

SortJavaStaticImport: Before

SortUsingDeclarations: LexicographicNumeric

SpaceAfterCStyleCast: false

SpaceAfterLogicalNot: false

SpaceAfterTemplateKeyword: false

SpaceAroundPointerQualifiers: Default

SpaceBeforeAssignmentOperators: true

SpaceBeforeCaseColon: false

SpaceBeforeCpp11BracedList: false

SpaceBeforeCtorInitializerColon: true

SpaceBeforeInheritanceColon: true

SpaceBeforeJsonColon: false

SpaceBeforeParens: ControlStatements

SpaceBeforeParensOptions:
  AfterControlStatements: true
  AfterForeachMacros: true
  AfterFunctionDefinitionName: false
  AfterFunctionDeclarationName: false
  AfterIfMacros: true
  AfterOverloadedOperator: false
  AfterPlacementOperator: true
  AfterRequiresInClause: false
  AfterRequiresInExpression: false
  BeforeNonEmptyParentheses: false

SpaceBeforeRangeBasedForLoopColon: true

SpaceBeforeSquareBrackets: false

SpaceInEmptyBlock: false

SpacesBeforeTrailingComments: 1

SpacesInAngles: Never

SpacesInContainerLiterals: false

SpacesInLineCommentPrefix:
  Minimum: 1
  Maximum: 1

SpacesInParens: Never

SpacesInParensOptions:
  InCStyleCasts: false
  InConditionalStatements: false
  InEmptyParentheses: false
  Other: false

SpacesInSquareBrackets: false

Standard: Latest

StatementAttributeLikeMacros:
  - Q_EMIT
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION

TabWidth: 4

UseTab: Never

VerilogBreakBetweenInstancePorts: true

WhitespaceSensitiveMacros:
  - BOOST_PP_STRINGIZE
  - CF_SWIFT_NAME
  - NS_SWIFT_NAME
  - PP_STRINGIZE
  - STRINGIZE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值