VS Code自动格式化的实现

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插件(必选)
Chinese插件
然后是Clang-Format插件(必选)
这里就要有人问了,你为什么不用AStyle呢?
AStyle不是更好配置吗?
但是AStyle的配置的选项比较少,也不是很智能,而且不知道为什么有时候加载很慢(可能是因为我的插件比较多)

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的东西就不能反哺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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值