目录

1、默认编码&行号

2、显示空格,制表符(tab)

3、制表符(tab)转空格

4、快捷键(Windows平台)

5、插件

5.1、插件C/C++

5.2、插件Gitlens

5.3、插件Git History

5.4、插件Git History

5.5、插件Astyle

5.6、插件KoroFileHeader

6、代码风格


本文将介绍专业猿哥在使用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 {
 public:
  void foo(int* a) {
    if (a) {
      for (int i = 0; i < 10; ++i) {
        ++*a;
      }
    }
  }
};

C++ 语言​

LLVM 风格

编译器、系统库、嵌入式

编译器项目验证、高效

Type *ptr; // 指针靠变量

class MyClass {
public://与google有差异
  void foo(int *a) {
    if (a) {
      for (int i = 0; i < 10; ++i) {
        ++*a;
      }
    }
  }
};

注:大括号换行都是支持自定义。如

BasedOnStyle: Chromium #Microsoft # GNU # Google #Chromium #LLVM  # 或其他基础风格

BreakBeforeBraces: Linux #Allman

IndentWidth: 4      # Allman 风格通常用4空格缩进

# # 每行字符长度的限制,0表示没有限制

ColumnLimit: 0

# # 指针和引用(*和&)的对齐规则

PointerAlignment: Left

更多推荐