VS Code自动格式化的实现
文章目录
前言
此文章已部分废弃,最后的格式化文件没有什么太大的价值了,最新的格式化插件和文件请查看我的最新文章“使用 Uncrustify 进行代码格式化”
最近(很久以前了)上了一节名为C++课程设计的课,在写屎山时遇到了许多问题:
没下VS Code(用的Code Blocks);
下了VS Code没空间下Qt(什么东西都往C盘下);
听说我已经把项目基础逻辑写完以后要自己单干的(不知道在想什么);
用一堆星号做游戏地图的(我就是很好奇怎么设置状态);
要交报告了还没写完自己单干的活的(天天看手机);
给老师验收完项目以后表示下次能不能用VS Code做图形化(不好说啥);
……
(这是一个正经学计算机的人能干出来的事吗?)
前言 2
好久没更新了,最近一直在折腾各种环境的配置,包括rime输入法的皮肤和方案;doxygen,即自动生成文档和注释;Include What You Use,问就是没配成;翻译Clang-Format样式的官网;研究C&++的项目目录设置,CMake(比makefile好写多了)的配置和C&++编程规范(自用);Html的各种实用且不会冲突的插件;Markdown的排版规范……
如果哪天我想起来了或者是有人催更,我应该会写的
为什么要进行代码格式化
除以上问题之外,代码的排版有问题同样对低血压有很好的治疗效果,如:
fun1 () {
/* 内容 */
} // 注释
fun_2()// 注释
{ /* 内容 */
}
Fun3(){
// 注释
/* 内容 */}
(看着就不是很舒服)
前置条件
一、安装VS Code
我想能看到这篇文章的人应该会下载VS Code吧?
二、配置VS Code
配置C语言/C++请点击查看
配置Java请点击查看
配置Python请点击查看
配置其他语言请自行百度/CSDN/B站大学/博客园
这里附赠一些常用工具(指MinGW64 14.2.0,LLVM 19.1.0,CMake 3.31.4),压缩包为rar格式,大小约为542MB。
(如果链接炸了请记得让我补档)
三、下载插件
首先是Chinese插件(必选)
然后是Clang-Format插件(必选)
这里就要有人问了,你为什么不用AStyle呢?
AStyle不是更好配置吗?
但是AStyle的配置的选项比较少,也不是很智能,而且不知道为什么有时候加载很慢(可能是因为我的插件比较多)
一个可下可不下的插件
配置环境
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的东西就不能反哺C呢?(主要是C没有一个统一的规范)
这本书里提及了许多代码的规范,有助于我们写出有些条理的屎山(建议全文背诵)
以下是我基于《Java开发手册(黄山版)》写的Clang-Format格式化文件(C语言和C++版本)
文件名设置成.clang-format(请打开查看文件扩展名,然后直接粘贴进去)
将设置好的文件移动到 C:/Program Files/LLVM/bin 这个位置或者是你自己下载的位置
(不要问为什么没翻译完,问就是翻译不动)
(2025-02-03记,终于抽出时间翻译完了)
# 语言
# 语言
Language: Cpp
# 基于的编码规范, 可选:
# - 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
# 是否跨过空行, 即多个对齐语句中间有空行时, 是否跨过
AcrossEmptyLines: false
# 同AcrossComments: 即是否跨过注释
AcrossComments: false
# 是否跨过复合语句(包括空行及注释)
AlignCompound: false
# 函数指针是否一致
AlignFunctionPointers: false
# 是否(右)对齐赋值操作的操作符
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: Right
# 水平对齐二进制和三进制的操作数表达式
AlignOperands: Align
# 控制尾随注释
AlignTrailingComments:
Kind: Never
OverEmptyLines: 0
# 如果函数调用或支撑的初始值设定项列表不适合行,允许将所有参数放在下一行
AllowAllArgumentsOnNextLine: true
# 如果函数声明不适合一行,允许将函数声明的所有参数放在下一行
AllowAllParametersOfDeclarationOnNextLine: true
# Noexcept说明符之前是否可以有换行符
AllowBreakBeforeNoexceptSpecifier: Never
# 是否将短的代码块合并成一行
AllowShortBlocksOnASingleLine: Empty
# 是否将短的case标签合并为一行
AllowShortCaseLabelsOnASingleLine: false
# 是否允许在单行上提出短复合要求
AllowShortCompoundRequirementOnASingleLine: false
# 是否允许在一行上使用短枚举
AllowShortEnumsOnASingleLine: false
# 是否将短的函数、方法合并成一行
AllowShortFunctionsOnASingleLine: Empty
# 是否将短的if语句合并成一行
AllowShortIfStatementsOnASingleLine: Never
# 是否将短的lambda表达式合并成一行
AllowShortLambdasOnASingleLine: Empty
# 是否将短的循环语句合并成一行
AllowShortLoopsOnASingleLine: false
# 是否在多行字符串文本之前换行
AlwaysBreakBeforeMultilineStrings: false
AttributeMacros:
- __capability
# 函数调用的实参是否位于同一行
BinPackArguments: true
# 函数调用的形参是否位于同一行
BinPackParameters: true
BitFieldColonSpacing: Both
# 相邻字符串文本之间的换行
BreakAdjacentStringLiterals: true
BreakAfterAttributes: Always
# # * 是否在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: 120
# 描述具有特殊含义的注释的正则表达式, 不应拆分为几行或以其他方式更改
CommentPragmas: "^ IWYU pragma:"
# 是否将连续的命名空间声明放在同一行
CompactNamespaces: false
# 用于缩进构造函数的字符数,初始值设定项列表以及继承列表
ConstructorInitializerIndentWidth: 4
# 行延续的缩进宽度
ContinuationIndentWidth: 4
# 支持列表格式设置为符合C++11
Cpp11BracedListStyle: true
DerivePointerAlignment: true
# ! 是否完全禁用格式设置(慎用)
DisableFormat: false
# 定义何时在访问修饰符后放置空行
EmptyLineAfterAccessModifier: Never
# 定义何时在访问修饰符前放置空行
EmptyLineBeforeAccessModifier: LogicalBlock
# 添加缺少的命名空间结束注释 命名空间并修复无效的现有命名空间
FixNamespaceComments: true
# 应解释为循环的宏向量,而不是作为函数调用
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
# 应解释为条件的宏向量,而不是作为函数调用
IfMacros:
- KJ_IF_MAYBE
# 头文件排序
IncludeBlocks: Regroup
# 表示不同类别的正则表达式
IncludeCategories:
- Regex: '.*\.(h|hpp)$' # 匹配当前文件同名的头文件(如main.h或main.hpp)。
Priority: 1 # 优先级为1(最高优先级)。
SortPriority: 0 # 排序优先级为0。
CaseSensitive: false # 不区分大小写。
- Regex: "^<.*>" # 匹配官方库头文件(如<iostream>、<vector>等)。
Priority: 2 # 优先级为2。
SortPriority: 0 # 排序优先级为0。
CaseSensitive: false # 不区分大小写。
- Regex: ".*" # 匹配所有其他头文件。
Priority: 3 # 优先级为3(最低优先级)。
SortPriority: 0 # 排序优先级为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: Wrapped
IntegerLiteralSeparator:
Binary: 4
BinaryMinDigits: 4
Decimal: 4
DecimalMinDigits: 4
Hex: 4
HexMinDigits: 4
# # JavaScript字符串使用的引号类型(双引号)
# JavaScriptQuotes: Double
# # JavaScript导入语句是否换行
# JavaScriptWrapImports: true
KeepEmptyLines:
AtEndOfFile: true
AtStartOfBlock: true
AtStartOfFile: false
# Lambda函数体的缩进方式
LambdaBodyIndentation: Signature
# 行尾换行符类型
LineEnding: LF
# 宏块开始标记
MacroBlockBegin: ""
# 宏块结束标记
MacroBlockEnd: ""
# 最大连续空行数
MaxEmptyLinesToKeep: 1
# 命名空间缩进方式
NamespaceIndentation: All
# # Objective-C协议列表打包方式
# ObjCBinPackProtocolList: Auto
# # Objective-C代码块缩进宽度
# ObjCBlockIndentWidth: 4
# # Objective-C嵌套块参数前是否换行
# ObjCBreakBeforeNestedBlockParam: true
# # Objective-C属性后是否添加空格
# ObjCSpaceAfterProperty: false
# # Objective-C协议列表前是否添加空格
# 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: false
# 是否移除LLVM风格的大括号
RemoveBracesLLVM: false
# 是否移除多余的括号
RemoveParentheses: MultipleParentheses
# 是否移除多余的分号
RemoveSemicolon: false
# requires子句的位置
RequiresClausePosition: OwnLine
# requires表达式的缩进方式
RequiresExpressionIndentation: OuterScope
# 定义块之间的分隔方式
SeparateDefinitionBlocks: Never
# 短命名空间的最大行数
ShortNamespaceLines: 0
# 是否跳过宏定义体的格式化
SkipMacroDefinitionBody: false
# include语句排序方式
SortIncludes: CaseInsensitive
# # Java静态导入排序方式
# SortJavaStaticImport: Before
# using声明排序方式
SortUsingDeclarations: LexicographicNumeric
# C风格类型转换后是否添加空格
SpaceAfterCStyleCast: false
# 逻辑非操作符后是否添加空格
SpaceAfterLogicalNot: false
# 模板关键字后是否添加空格
SpaceAfterTemplateKeyword: false
# 指针限定符周围的空格处理
SpaceAroundPointerQualifiers: Default
# 赋值操作符前是否添加空格
SpaceBeforeAssignmentOperators: true
# case冒号前是否添加空格
SpaceBeforeCaseColon: false
# C++11初始化列表前是否添加空格
SpaceBeforeCpp11BracedList: true
# 构造函数初始化列表冒号前是否添加空格
SpaceBeforeCtorInitializerColon: true
# 继承冒号前是否添加空格
SpaceBeforeInheritanceColon: true
# # JSON冒号前是否添加空格
# 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
# 基于范围的for循环冒号前是否添加空格
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
# C++标准版本
Standard: Latest
# 类似语句属性的宏
StatementAttributeLikeMacros:
- Q_EMIT
# 语句宏
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
# Tab键宽度
TabWidth: 4
# 是否使用Tab键
UseTab: Never
# Verilog实例端口之间是否换行
VerilogBreakBetweenInstancePorts: true
# 对空白敏感的宏
WhitespaceSensitiveMacros:
- BOOST_PP_STRINGIZE
- CF_SWIFT_NAME
- NS_SWIFT_NAME
- PP_STRINGIZE
- STRINGIZE