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插件(必选)
然后是Clang-Format插件(必选)
一个可下可不下的插件
配置环境
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