【SE】VScode使用规范
目录
本文将介绍专业猿哥在使用VScode中需要掌握的知识点
1、默认编码&行号
1.1、settings ->搜索"Encoding" -> 在下拉框中选择"UTF-8"。
1.2、settings ->搜索"Line Numbers" -> 在下拉框中选择"on"
2、显示空格,制表符(tab)
2.1、settings ->搜索 "Render Whitespace" -> 在下拉框中选择"all"。
3、制表符(tab)转空格
3.1、settings ->搜索"Insert Spaces" -> 勾选。按TAB后插入空格。
3.2、settings ->搜索"Tab Size" -> 输入"4"。1个tab替换4个空格。
3.3、settings ->搜索"Detect Indentation" -> 反选。不然上两个配置不生效。
4、快捷键(Windows平台)
4.1、快捷键查看:菜单File -> preference -> Keyboard Shortcuts。查看所有快捷键。选定快捷键右击 -> change Keybinding 更改绑定键。

4.2、多行注释:"Toggle Line Comment"开关行注释 -> 默认为ctrl + / 也可自定义。
4.3、多行反注释:"Toggle Line Comment"开关行注释 -> 默认为ctrl + / 也可自定义。
4.4、文件内搜索:Ctrl + F
4.5、全局搜索:Ctrl + Shift + F
4.6、撤消(undo):Ctrl + Z
4.7、恢复(redo):Ctrl + Y(或 Ctrl + Shift + Z)
4.8、跳转到上一次光标所在的位置(Back):Alt+ LeftArrow
4.9、跳转到下一次光标位置(Forward):Alt + RightArrow
4.10、跳转到定义(Go to Definition):按住 Ctrl 再点击函数/变量/类名
4.11、预览peek:Peek Definition(Alt+F12),Peek References(Shift+F12)。Peek Declaration / Peek Type Definition / Peek Call Hierarchy” 都没有预置全局快捷键,需要自己在
File → Preferences → Keyboard Shortcuts 里给它们绑定想要的组合键。
4.12、打开命令面板:Ctrl+Shift+P打开命令面板。也可手动在文件搜索框中输入“>”。
5、插件
VScode插件非常丰富强大。插件安装可以从侧边栏extensions或菜单File -> preference -> extensions进入。插件的配置都是在菜单File -> preference -> settings -> extensions 中配置。
5.1、插件C/C++
extensions ->搜索“C/C++”。选安装。让 VS Code 能看懂、能编译、能调试 C/C++ 代码。
5.1.1、具体功能拆成 5 类:
| 智能感知 | IntelliSense 自动补全、跳转定义/声明、实时错误波浪线、头文件路径自动索引;支持 C++20 模块、Clang/GCC/MSVC 三套件。 |
| 调试 | 一键 F5 启动 GDB、LLDB、MSVC 调试器;内置断点、变量监视、调用栈、Memory 视图、反汇编、Core Dump 调试。 |
| 构建 | 自动扫描 CMake/Make/Ninja 工程,生成 compile_commands.json;也能用 tasks.json 调用任意编译命令,输出解析到问题面板。 |
| 代码浏览 | Outline、调用层次、类型层次、符号搜索(Ctrl+T)、Peek 定义、跨文件重命名重构。 |
| 附加工具 | 内置格式化(clang-format)、静态分析(clang-tidy)、自动添加头文件、Doxygen 注释模板、HLSL/CUDA 语法高亮。 |
5.1.2、clang-format 配置
BasedOnStyle 基础风格有: LLVM, Google, Chromium, Mozilla, WebKit, Microsoft, GNU。
Language 语言有: Cpp, C, Java, JavaScript, ObjC, Proto
---
#.clang-format
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
BasedOnStyle: LLVM
Language: Cpp
# this style configuration is based on google style configuration.
# The following configuration is different from the basic configuration.
# 缩进宽度
IndentWidth: 4
# 访问权限说明符(public/private等)的偏移
AccessModifierOffset: -4
# # 开括号(开圆括号、尖括号、方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行)
# AlignAfterOpenBracket: Align
# # 连续赋值时,对齐所有等号
# AlignConsecutiveAssignments: false
# # 连续声明时,对齐所有声明的变量名
# AlignConsecutiveDeclarations: false
# 反斜杆换行的对齐方式
# -- DontAlign - 不进行对齐
# -- Left - 反斜杠靠左对齐
# -- Right - 反斜杠靠右对齐
# AlignEscapedNewlines: Right
# 二元、三元表达式的对齐方式(当表达式需要占用多行时)
# -- DontAlign - 不进行对齐
# -- Align - 从操作符开始对齐
# -- AlignAfterOperator - 从操作数开始对齐
AlignOperands: true
# # 是否对齐行尾注释
# AlignTrailingComments: true
# # 函数声明的所有参数在放在下一行
# AllowAllParametersOfDeclarationOnNextLine: false
# # 是否允许短的代码块放在同一行
# AllowShortBlocksOnASingleLine: false
# # 短的case标签和语句放在同一行
# AllowShortCaseLabelsOnASingleLine: true
# # 短的函数放在同一行
# -- None - 不把短的函数放在同一行
# -- InlineOnly - 只把类内的内联函数放在同一行,全局的空函数不放在同一行
# -- Empty - 只把空的函数放在同一行
# -- Inline - 把类内的内联函数放在同一行,全局的空函数不放在同一行
# -- All - 都允许放在同一行
AllowShortFunctionsOnASingleLine: InlineOnly
# # 短的if语句保持在同一行
# AllowShortIfStatementsOnASingleLine: true
# # 短的循环保持在同一行
# AllowShortLoopsOnASingleLine: true
# # 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数),
# # AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义)
# AlwaysBreakAfterReturnType: None
# # 总是在多行string字面量前换行
# AlwaysBreakBeforeMultilineStrings: true
# # 总是在template声明后换行
AlwaysBreakTemplateDeclarations: true
# # 函数调用时,参数的放置规则
# -- false - 参数要么放在同一行,要么每个参数占用一行
# -- true - 不做强制要求
# BinPackArguments: true
# 函数声明、定义时,参数的放置规则
# -- false - 参数要么放在同一行,要么每个参数占用一行
# -- true - 不做强制要求
# BinPackParameters: true
# 大括号放置风格
# -- Attach - 大括号紧随前方内容,放在同一行
# -- Linux - 与 Attach 类似,除了 函数、命名空间、类定义 的大括号放在下一行
# -- Mozilla - 与 Attach 类似,除了枚举、函数、结构(class\struct\union)的大括号放在下一行
# -- Stroustrup - 与 Attach 类似,但函数定义前、catch前方、else前方的"{}"放在单独一行
# -- Allman - 总是换行
# -- Whitesmiths - 类似 Allman,但"{}"和内部的语句对齐到同样位置
# -- GNU - 总是换行,但在控制语句后的"{}"总是对齐到下一个位置
# -- WebKit - 与 Attach 类似,但在函数定义前换行
# -- Custom - 依赖 BraceWrapping
# 注:这里认为语句块也属于函数
BreakBeforeBraces: Custom
# 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:
# class定义后面
AfterClass: true
# 控制语句后面
AfterControlStatement: false
# enum定义后面
AfterEnum: false
# 函数定义后面
AfterFunction: true
# 命名空间定义后面
AfterNamespace: true
# ObjC定义后面
AfterObjCDeclaration: false
# struct定义后面
AfterStruct: false
# union定义后面
AfterUnion: false
# extern之后
AfterExternBlock: true
# catch之前
BeforeCatch: false
# else之前
BeforeElse: false
# 继续缩进大括号
IndentBraces: false
# 分离空函数
# # 当空白函数的"{}"和函数名称不需要放在同一行时,是否拆分函数体
SplitEmptyFunction: true
# 分离空语句
# # 当空白结构(class\struct\union)的"{}"需要放在单独的行时,是否拆分"{}"
SplitEmptyRecord: true
# 分离空命名空间
# # 当空白的命名空间的"{}"需要放在单独的行时,是否拆分"{}"
SplitEmptyNamespace: true
# # 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators: NonAssignment
# BreakBeforeInheritanceComma: false
# # 在三元运算符前换行
# 当三元表达式不能放在同一行时,是否在三元操作符前方换行
# -- true - 操作符位于新行的首部
# -- false - 操作符位于上一行的尾部
BreakBeforeTernaryOperators: true
# BreakConstructorInitializersBeforeComma: false
# # 构造函数初始化列表分割方式
# -- BeforeColon - 在冒号 ':' 前方分割,冒号位于行首,逗号','位于行尾
# -- BeforeComma - 在冒号和逗号前方分割,冒号和逗号都位于行首,并且对齐
# -- AfterColon - 在冒号和逗号后方分割,冒号和逗号位于行尾
BreakConstructorInitializers: BeforeColon
# # 是否在每个java注解后方换行
# BreakAfterJavaFieldAnnotations: false
# # 是否分割过长的字符串
# BreakStringLiterals: false
# # 每行字符长度的限制,0表示没有限制
ColumnLimit: 100
# # 用于匹配注释信息的正则表达式,被匹配的行不会做任何修改
# CommentPragmas: '^ IWYU pragma:'
# 是否压缩紧接的命名空间
# -- true - 将紧跟的命名空间放在同一行
# -- false - 每个命名空间位于新的一行
CompactNamespaces: false
# # 构造函数的初始化列表要么都在同一行,要么都各自一行
# -- true - 如果可能,初始化列表放在同一行;如果不满足长度选择,则每个单独放一行
# -- false - 初始化列表可以随意放置
# ConstructorInitializerAllOnOneLineOrOnePerLine: false
# # 构造函数的初始化列表和基类集成列表的对齐宽度
ConstructorInitializerIndentWidth: 4
# # 延续语句的对齐宽度
ContinuationIndentWidth: 4
# # 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle: true
# 是否自动分析指针的对齐方式
# -- true - 自动分析并使用指针的对齐方式,若无法分析,则使用 PointerAlignment
# -- false - 不自动分析
# DerivePointerAlignment: true
# 是否禁用格式化
DisableFormat: false
# ExperimentalAutoDetectBinPacking: false
# 是否自动修正命名空间的结束注释
# -- true - 在短的命名空间尾部,自动添加或修改错误的命名空间结束注释
# -- false - 不自动修正
FixNamespaceComments: true
# foreach 循环
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
# 多个 include 块(有空行分隔的include)排序时的分组规则
# -- Preserve - 保留原有的块分隔,各自排序
# -- Merge - 将所有的块视为同一个,然后进行排序
# -- Regroup - 将所有的块视为同一个进行排序,然后按照 IncludeCategories 的规则进行分组
IncludeBlocks: Preserve
# IncludeCategories:
# - Regex: '^<ext/.*\.h>'
# Priority: 2
# - Regex: '^<.*\.h>'
# Priority: 1
# - Regex: '^<.*'
# Priority: 2
# - Regex: '.*'
# Priority: 3
# IncludeIsMainRegex: '([-_](test|unittest))?$'
# # 缩进case标签
# -- true - case 不与 switch 对齐
# -- false - case 和 switch 对齐
IndentCaseLabels: true
# 预处理命令(#if\#ifdef\#endif等)的缩进规则
# -- None - 不进行缩进
# -- AfterHash - 在前导'#'后缩进,'#'放在最左侧,之后的语句参与缩进
# -- BeforeHash - 在前导'#'前进行缩进
IndentPPDirectives: AfterHash
# # 函数返回类型换行时,缩进函数声明或函数定义的函数名
# IndentWrappedFunctionNames: false
# JavaScript 中的字符串引号规则
# -- Leave - 保持原样
# -- Single - 全部使用单引号
# -- Double - 全部使用双引号
JavaScriptQuotes: Leave
# 是否在 JavaScript 的 import/export 语句后换行
# JavaScriptWrapImports: true
# # 保留在块开始处的空行
# -- true - 保留块起始的空行
# -- false - 删除块起始的空行
KeepEmptyLinesAtTheStartOfBlocks: true
# 用于识别宏定义型块起始的正则表达式
# MacroBlockBegin: ''
# 用于识别宏定义型块结束的正则表达式
# MacroBlockEnd: ''
# # 连续空行的最大数量
MaxEmptyLinesToKeep: 1
# # 命名空间内部的缩进规则
# -- None - 都不缩进
# -- Inner - 只缩进嵌套的命名空间内容
# -- All - 缩进所有命名空间内容
NamespaceIndentation: Inner
# Objective-C 相关配置
# ObjCBlockIndentWidth: 2
# ObjCSpaceAfterProperty: false
# ObjCSpaceBeforeProtocolList: false
# PenaltyBreakAssignment: 2
# PenaltyBreakBeforeFirstCallParameter: 1
# PenaltyBreakComment: 300
# PenaltyBreakFirstLessLess: 120
# PenaltyBreakString: 1000
# PenaltyExcessCharacter: 1000000
# PenaltyReturnTypeOnItsOwnLine: 200
# # 指针和引用(*和&)的对齐规则
# -- Left - * 靠近左侧
# -- Right - * 靠近右侧
# -- Middle - * 放在中间
# NOTE : 在 SpaceAroundPointerQualifiers 为 Default,
# 且 DerivePointerAlignment 失效后启用
PointerAlignment: Right
# RawStringFormats:
# - Delimiter: pb
# Language: TextProto
# BasedOnStyle: google
# # 重新排版注释
ReflowComments: false
# # 重新排序#include
# -- Never - 不进行排序
# -- CaseSensitive - 排序时大小写敏感
# -- CaseInsensitive - 排序时大小写不敏感
SortIncludes: false
# java 中静态 import 的排序规则
# -- Before - 静态放在非静态前方
# -- After - 静态放在非静态后方
# SortJavaStaticImport: Before
# # 重新排序using声明
SortUsingDeclarations: false
# # 在C风格类型转换后添加空格
SpaceAfterCStyleCast: false
# # 在Template关键字后面添加空格
SpaceAfterTemplateKeyword: true
# # 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators: true
# # 在 C++11 的初始化列表前加空格
# SpaceBeforeCpp11BracedList: true
# 在构造函数的初始化冒号":"前加空格
# SpaceBeforeCtorInitializerColon: true
# 在构造函数的继承冒号":"前加空格
# SpaceBeforeInheritanceColon: true
# 小括号"()"前加空格的规则
# -- Never - 从不加空格
# -- ControlStatements - 只在控制语句(for/if/while...)时加空格
# -- ControlStatementsExceptForEachMacros - 类型 ControlStatements,只是不再 ForEach 后加空格
# -- Always - 总是添加空格
# -- NonEmptyParentheses - 类似 Always,只是不再空白括号前加空格
SpaceBeforeParens: ControlStatements
# 在 for 循环的冒号":"前加空格
# SpaceBeforeRangeBasedForLoopColon: true
# # 在空白的小括号"()"中添加空格
SpaceInEmptyParentheses: false
# # 在行尾的注释前添加的空格数(只适用于//)
SpacesBeforeTrailingComments: 1
# # 在尖括号的"<"后,和">"前添加空格
SpacesInAngles: false
# # 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
SpacesInContainerLiterals: true
# # 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses: false
# # 在圆括号的"("后,和")"前添加空格
SpacesInParentheses: false
# 在中括号中加空格
# 当中括号内没有数据时,不受本规则影响(如空白的lambda 捕获表、不定长度的数组声明)
SpacesInSquareBrackets: false
# 语言标准: Cpp03, Cpp11, Auto
Standard: Auto
# # tab宽度
TabWidth: 4
# # 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab: Never
---
5.1.3、clang-format 配置执行。settings -> extensions -> c/c++ -> formatting 在此选项下可以选择具体的格式化工具。如选clang-format配置文件放在项目根目录,clang-format 会自动向上查找。创建一个通用的 .clang-format文件,通过合理的配置选项来处理多种语言。
5.2、插件Gitlens
extensions ->搜索“GitLens”。选安装。可查看代码的最后提交记录。
5.3、插件Git History
extensions ->搜索“Git History”。选安装。“文件时光机”——把当前文件(或单行)的所有提交按时间轴列出来,点一下就能 diff、回滚、对比任意两版,主打“快速查历史”。偶尔追文件变更,右键即可,不占资源。
5.4、插件Git Graph
extensions ->搜索“Git Graph”。选安装。当 SourceTree 用,分支操作全搞定。
5.5、插件Astyle
extensions ->搜索“Astyle”。选安装。Astyle是更经典、简单、快速。它通过文本和正则表达式处理代码。适合快速统一代码风格、处理多种语言(如:C#、PHP)、希望配置简单的场景。对于大多数新项目或严肃的 C/C++ 项目,clang-format 通常是更好的选择。它的“理解代码”能力避免了 Astyle 可能在某些复杂语法下出错的尴尬。此二者格式化工具都不支持CMake 文件(.cmake, CMakeLists.txt) ,python文件(.py)。
5.5.1、Astyle 配置
Astyle 配置比clang-format 配置简单很多。Astyle 的 --style 选项用于指定预定义的代码风格。Astyle 支持以下几种预定义风格:
allman(也称bsd):大括号单独成行。
java:类似 allman,但类和方法的括号处理略有不同。
kr(K&R风格):大括号不换行,函数定义的大括号换行。
stroustrup:Stroustrup 风格,类似于 allman,但函数定义的大括号不换行。
whitesmith:Whitesmith 风格,大括号单独成行,且缩进。
vtk:VTK 风格,大括号不换行,且缩进为2个空格。
ratliff:Ratliff 风格,大括号不换行,但类、函数、循环、条件等的大括号处理方式一致。
gnu:GNU 风格,大括号单独成行,且缩进为2个空格。
linux:Linux 风格,类似于 kr,但缩进使用制表符,且最大缩进为8个空格。
horstmann:Horstmann 风格,大括号不换行,但代码块缩进为3个空格。
1tbs:One True Brace Style,类似于 kr,但条件语句(如 if)的大括号不换行,且总是使用大括号。
# astyle --options=%h\astyle_config.txt
# Astyle 配置文件 - Allman 风格
--style=allman
--indent=spaces=4
--indent-classes
--indent-switches
--indent-namespaces
--indent-preproc-block
--pad-oper
--pad-comma
--pad-header
--align-pointer=type
--align-reference=type
--break-blocks
--delete-empty-lines
--max-code-length=120
--convert-tabs
--suffix=none
5.5.2、Astyle 配置执行
settings -> extensions -> Astyle configuration 在此选项下进行配置。
5.6、插件KoroFileHeader
fileheader:增加文件头注释
cursorTip:增加函数注释
{
"editor.renderWhitespace": "all",
"fileheader.customMade": {
"Copyright (C)": "${now_year}, Shenzhen HYT Science & Technology Co., Ltd.",
"FilePath": "only file name",
"Author": "Saiman ",
"Date": "Do not edit",
"ModifyHistory": "\r\nDate | Ver | Author | Description\r\n",
},
"fileheader.cursorMode": {
"brief": "",
"param": "",
"return": ""
},
"fileheader.configObj": {
"wideSame": true, // 设置为true开启,false
"wideNum": 13, // 字段长度 默认为13
"autoAdd": true, // 当创建新文件时,自动在文件开头添加文件头注释。
"autoAddLine": 100, // 表示当文件行数超过100行时,不自动添加文件头注释。
"language": {
"h/c/c++": {
"head": "/*-------------------------------------------------------------------------------------",
"middle": "* ",
"end": "-------------------------------------------------------------------------------------*/"
},
"txt/clang-format": {
"head": "#-------------------------------------------------------------------------------------",
"middle": "# ",
"end": "#-------------------------------------------------------------------------------------"
},
}
},
"C_Cpp.vcFormat.indent.caseContents": false,
"[c]": {
"editor.defaultFormatter": "ms-vscode.cpptools"
},
"C_Cpp.formatting": "clangFormat",
"editor.formatOnSave": true
}
6、代码风格
VS code中勾选 Editor: Format On Save 可以实现保存限格式化。
在系统终端/命令行中运行:clang-format -dump-config 查看clang-format完事配置。
在系统终端/命令行中运行:clang-format -style=Google -dump-config 查看特定风格。
在系统终端/命令行中运行:clang-format -style=LLVM -dump-config > .clang-format 生成配置模板文件。
| 语言 | 推荐风格 | 适用场景 | 关键优势 | 示例 |
|---|---|---|---|---|
| C 语言 | Linux 内核风格 | 系统编程、嵌入式、驱动 | 行业标准、紧凑清晰 | 缩进8个空格,函数大括号换行,语句大括号不换行,指针符号*靠近变量名。 |
| C 语言 | K&R 风格 | 1、应用开发、跨平台库。 2、与 Linux 风格相似但缩进不同,4空格 | 传统通用、广泛接受 | int main(int argc, char *argv[]) { if (argc != 2) { return 1; } // 4空格缩进,更传统 return 0; } |
| C 语言 | Allman 风格(BSD风格) | 1、K&R 风格对比:除大括号换行其它相近。 2、Chromium风格对比 :除缩进为 2 个空格,其它相近。 3、 | 括号匹配清晰,易于阅读 | int main(int argc, char* argv[]) { if (argc != 2) { return 1; } // 4空格缩进,更传统 return 0; } |
| C++ 语言 | Google 风格 | 现代应用、大型项目 | 现代 C++ 最佳实践 | Type* ptr; // 指针靠类型 class MyClass { |
| C++ 语言 | LLVM 风格 | 编译器、系统库、嵌入式 | 编译器项目验证、高效 | Type *ptr; // 指针靠变量 class MyClass { |
注:大括号换行都是支持自定义。如
BasedOnStyle: Chromium #Microsoft # GNU # Google #Chromium #LLVM # 或其他基础风格
BreakBeforeBraces: Linux #Allman
IndentWidth: 4 # Allman 风格通常用4空格缩进
# # 每行字符长度的限制,0表示没有限制
ColumnLimit: 0
# # 指针和引用(*和&)的对齐规则
PointerAlignment: Left
更多推荐
所有评论(0)