记录一下VSCode配置C++的内容吧。

插件列表

首先列一下目前在VSCode上使用的,涉及到C++的核心插件:

  • C/C++ (Microsoft):微软官方默认的C/C++插件,禁用了代码提示,但是调试这些还需要用它,不能完全禁用
  • clangd (LLVM):LLVM官方提供的,当前代码提示的主力插件
  • CMake (twxs):CMake的语言支持,CMakeLists的语法高亮等
  • CMake Tools (Microsoft):微软官方提供的CMake支持,提供CMake命令工具条和快捷指令
  • CodeLLDB (Vadim Chugunov):lldb调试支持,非官方支持

还有两个不太重要的插件:

  • C/C++ Themes (Microsoft)
  • Better C++ Syntax (Jeff Hykin)

C/C++插件和clangd插件配置

主要的内容是禁用默认C/C++插件的主要功能,然后用clangd以及对应插件替换掉,并对clangd进行配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//**************************************************************************//
//[[C++]]
// 关闭默认C/C++插件的格式化 C_Cpp.formatting
"C_Cpp.formatting": "disabled",
// 关闭默认C/C++插件的智能提示 C_Cpp.intelliSenseEngine
"C_Cpp.intelliSenseEngine": "disabled",
// 关闭默认C/C++插件的自动补全 C_Cpp.autocomplete
"C_Cpp.autocomplete": "disabled",
// 关闭默认C/C++插件的错误曲线 C_Cpp.errorSquiggles
"C_Cpp.errorSquiggles": "disabled",
// 关闭默认C/C++插件的自动代码分析 C_Cpp.codeAnalysis.runAutomatically
"C_Cpp.codeAnalysis.runAutomatically": false,
// C/C++的默认配置由cmaketools提供 C_Cpp.default.configurationProvider
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
// clangd的分析参数 clangd.arguments
"clangd.arguments": [
"--completion-style=detailed",
"--clang-tidy",
"--background-index",
"--enable-config",
"--header-insertion=never",
"--header-insertion-decorators",
"--fallback-style=LLVM",
// "--fallback-style=WebKit" 4缩进
],
// clangd在没有找到编译指令文件时基于如下编译指令进行静态分析 clangd.fallbackFlags
"clangd.fallbackFlags": [
"-I${workspaceFolder}",
"-I${workspaceFolder}/include",
"-fsanitize=address",
"-fsanitize=undefined",
"-Wall",
"-Wextra",
"-Wshadow",
"-Wfatal-errors",
"-Wno-unused-variable",
"-Wno-unused-parameter"
],
// clangd自动检测插件冲突 clangd.detectExtensionConflicts
"clangd.detectExtensionConflicts": true,
"clangd.checkUpdates": true,

CMaketools插件配置

对CMake提供支持的插件配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//**************************************************************************//
//[[cmake]]
// cmake关闭自动配置 cmake.autoSelectActiveFolder
"cmake.autoSelectActiveFolder": false,
// cmake关闭在打开时自动配置 cmake.configureOnOpen
"cmake.configureOnOpen": false,
// cmake关闭在编辑时自动配置 cmake.configureOnEdit
"cmake.configureOnEdit": false,
// cmake状态条可见性 cmake.options.statusBarVisibility
"cmake.options.statusBarVisibility": "compact",
"cmake.options.advanced": {
"cpack": {
"statusBarVisibility": "hidden"
},
"workflow": {
"statusBarVisibility": "hidden"
},
"debug": {
"statusBarVisibility": "hidden"
},
"ctest": {
"statusBarVisibility": "icon"
}
},
"cmake.preferredGenerators": [
"Ninja"
],
"cmake.pinnedCommands": [
"cmake.configure",
"cmake.build",
"cmake.cleanConfigure",
"cmake.selectKit",
"cmake.setVariant",
"cmake.showConfigureCommand"
],
"cmake.showOptionsMovedNotification": false,

如果CMakeLists.json插件在识别编译工具链时出现错误,可以手动修改下面的配置文件,或者直接删除,让它重新扫描配置

  • 在Windows中,配置文件位于~/AppData/Local/CMakeTools/cmake-tools-kits.json
  • 在WSL2中,配置文件位于~/.local/share/CMakeTools/cmake-tools-kits.json

C++调试配置

下面的部分是关于CMake项目调试的配置,早期这种配置必须存放在项目的.vscode/launch.json文件中, 现在已经支持在settings.json中添加默认配置了。

这三种配置使用的调试器分别是:

  • lldb
  • gdb
  • vsdbg

分别对应与clang,gcc和MSVC。

用它们调试对应的编译器得到的可执行程序通常是没问题的,但是混用是很可能有问题的,在windows上

  • vsdbg可以调试target是MSVC的clang得到的可执行文件
  • vsdbg不支持调试gcc+MinGW或clang+MinGW得到的可执行文件
  • lldb可能可以替代gdb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//**************************************************************************//
//[[launch]]
// 默认的launch设置,搭配cmake和gdb/lldb使用,不需要单独的launch.json
"launch": {
"configurations": [
{
"name": "lldb(CMake)",
"type": "lldb",
"request": "launch",
"program": "${command:cmake.launchTargetPath}",
"args": [],
"cwd": "${workspaceFolder}",
"console": "integratedTerminal"
},
{
"name": "gdb(CMake)",
"type": "cppdbg",
"request": "launch",
"program": "${command:cmake.launchTargetPath}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [
{
"name": "PATH",
"value": "${env:PATH}:${command:cmake.getLaunchTargetDirectory}"
}
],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /usr/bin/gdb -q --interpreter=mi"
},
{
"name": "vsdbg(CMake)",
"type": "cppvsdbg",
"request": "launch",
"program": "${command:cmake.launchTargetPath}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [
{
"name": "PATH",
"value": "${env:PATH}:${command:cmake.getLaunchTargetDirectory}"
}
],
"console": "externalTerminal"
}
],
"compounds": []
},

补充

必要软件

为了正常使用所有功能,除了针对VSCode的配置,至少还需要单独安装下列软件,并把路径添加到PATH

  • Git
  • CMake
  • clangd(通常是clang附带下载的)
  • ninja

vscode 快捷键

和 vim 类似,为了提高效率,有必要整理一下 vscode 常用的快捷键。(虽然 vscode 也支持 vim 模式,但是毕竟没有原始的快捷键体系方便)

两个最主要的:

  • ctrl+p 快速打开
    • :n 转到第 n 行
    • @symbol 查找并跳转到符号(对于 md 文件是各级目录)
    • filename 打开当前文件夹的其他文件
  • ctrl+shift+p 快速打开命令面板(相当于快速打开后加上>继续输入命令)
  • ctrl+shift+o 快速打开符号查找(相当于快速打开后加上@继续输入命令)

主要操作

  • ctrl+, 进入设置的 GUI 界面
  • ctrl+shift+n 打开新的 vscode 窗口实例
  • ctrl+shift+m 显示问题界面
  • `ctrl+`` 显示或关闭集成终端界面
  • ctrl+shift+~ 显示集成终端界面并新建一个终端实例
  • ctrl+<enter>在下方插入一行,光标也随之移动
  • ctrl+shift+<enter>在上方插入一行,光标也随之移动(这个有很多快捷键冲突,可能没有用)

当前光标未选择内容时,复制剪切粘贴都是以当前行为单位进行的:

  • ctrl+c 复制当前行
  • ctrl+x 剪切当前行
  • ctrl+v 粘贴到当前行的前面

其他

  • ctrl+shift+k删除当前行
  • alt+up 把当前行上移
  • alt+down 把当前行下移
  • shift+alt+up 把当前行复制并插入到上方
  • shift+alt+down 把当前行复制并插入到下方