当前位置:   article > 正文

VSCode 配置 C++:VSCode + Clang + Clangd + LLDB + CMake + Git_vscode clang

vscode clang

CSDN 版本已不再更新,请查看 Windows/MacOS/Linux 上 VSCode 配置 C++: Clang + Clang-based Tools + CMake


-1- 前言

①目的

        我于 2021 年 4 月末 5 月初正式开始学习 C++,前几月一直使用 VSCode + GCC + GDB + Git 进行学习,翻阅韩骏老师的《Visual Studio Code 权威指南》时,发现他在 C++ 栏目里推荐了名为「vscode-clangd」的插件(已改名为clangd)。

        后配置相关插件时遇到诸多问题,查阅不少文章、文档,经几天才配置满意。想到可能有同道会遇到同样的问题,故而写下本文章。

        文章主旨是初学 C++ 的人简易地配置出一个满意的编程环境,不会有 CMake、Git 等的详细教程。我认为这就像婴儿学步一样:婴儿练习的是跑步,经历多次跌倒后很快便学会了走路,借助学步车的反而学得很慢。

        ——我想提供的是「助跑器」,而不是「学步车」。

        由于仅从今年4月开始学习,会存在很多疏漏和不够专业的地方,还望海涵。

②与按照官方文档配置好的 VSCode 相比拥有的优势

  • 代码拥有更加丰富的颜色。我利用 VSCode Default Dark+ 主题自带的代码颜色的互补色、相近色,为「类型参数」、「成员函数」、「成员变量」、「函数参数」等与「类」、「自动变量」的颜色作了区分。
代码拥有更加丰富的颜色
代码拥有更加丰富的颜色
  • 相对更加精准的「功能」、「转到定义」、「重命名符号」等功能。
  • Clang-Tidy提供了强大的「静态检查」支持,并对于部分代码提供「快速修复」。具体请见Clang-Tidy Checks。这里我主要添加了对于「Google 开源项目风格指南(有中文版,但翻译版本滞后,需注意)」「Cpp Core Guidelines」和性能、潜在的bug、移植性、现代C++的检查。
静态检查
  • 自动添加头文件。对于建议中的项会即时自动添加头文件,导航条会自动下移(观察行号)隐藏添加的头文件。
自动添加头文件
自动添加头文件
  • 利用「Git」进行版本管理。
  • 通过「CMake」实现项目管理。

③未解决的问题

  • 用 LLDB 调试时,无法正确跳转到「系统头文件」而显示为「未知源」,使用 GDB 调试同一个文件则没有此问题。尝试过「vscode-lldb 在 GitHub 的 Issues 中给出的静态链接相关库」和「Clang 编译器用户手册中给出的将 -g 改为 -glldb」等方法,最终无果。

-1- 安装

①安装 VSCode

通过官方网站获取

下载安装包并安装即可,略。

下载慢?请参考《VSCode官网下载缓慢或下载失败的解决办法》

这里给出 x86_64 1.60.0 版本的下载链接

②安装 MSYS2

通过官方网站获取

下载安装包并安装即可,略。

下载慢?通过清华大学开源软件镜像站获取

进入清华大学开源软件镜像站,点击右侧的「获取下载链接」,切换到「应用软件」即可找到。

清华大学开源软件镜像站

③安装 Git

通过官方网站获取

下载安装包并安装即可,略。

下载慢?通过清华大学开源软件镜像站获取

进入清华大学开源软件镜像站,点击右侧的「获取下载链接」,切换到「应用软件」即可找到。

 安装时,切换 Git 的默认编辑器为 VSCode。

切换 Git 的默认编辑器为 VSCode

④配置环境变量

右键「开始」菜单,选择「系统」,在「系统」中点击「高级系统设置」,选择「环境变量(N)...」,在上方的「用户变量」或下方的「系统变量」,找到「Path」并选中编辑。

如果得到的是图一样式,在原「变量值」尾部加入英语输入法下的分号「;」后,加入「MSYS2 安装路径\clang64\bin」(默认为 C:\msys64\clang64\bin)。

图一

如果得到的是图二样式,点击「新建」,并输入「MSYS2 安装路径\clang64\bin」(默认为 C:\msys64\clang64\bin)即可。

图二

同样的我们也可以把C:\msys64\mingw64\bin加入其中,但我并没有用上。

⑤利用 MSYS2 安装「Clang」「CMake」「Git」等软件

通过「开始」菜单,或路径(默认为 C:\msys64 )打开「MSYS2.exe」

以下是会用到的指令:

  1. pacman -Syu // 更新整个系统
  2. pacman -Su // 更新已安装的包
  3. pacman -Ss 关键字 // 搜索含关键字的包
  4. pacman -S 包名 // 安装包,也可以同时安装多个包,只需以空格分隔包名即可
  5. pacman -Rs 包名 // 删除包及其依赖
  6. pacman -R 包名 // 删除包

比如《C++程序设计:原理与实践》一书中提到 FLTK 库。输入「pacman -Ss fltk」进行搜索,会查找到众多包名。由于使用的是clang64,所以需要安装以clang64/开头的「mingw-w64-clang-x86_64-fltk」。可以通过右键进行复制,接着输入「pacman -S mingw-w64-clang-x86_64-fltk」即可安装。

pacman -Ss fltk

这里我直接列出需要执行的指令:

  1. pacman -S mingw-w64-clang-x86_64-toolchain mingw-w64-clang-x86_64-cninja mingw-w64-clang-x86_64-python-six mingw-w64-clang-x86_64-python-pip
  2. pip install cmake_format
  3. pacman -Syu
  4. pacman -Syu

题外话:笔者最近使用 cpan 安装 Perl 模块时发现,需要使用的是 Clang64.exe,来安装对应 perl 的模块,而非 msys2.exe.

⑥在 VSCode 中安装需要的插件

打开「VSCode」点击左边栏上方最后一项「Extensions」以进行插件安装,必需的插件请见快速安装我所推荐插件。

当然,我们也可以搜索「Chinese」安装汉化界面插件,后面的表述也会用汉化后的界面,更多插件请见「-4-(可选)我所使用的VSCode插件」。

快速安装我所推荐插件 

用「VSCode」打开一个文件夹,在该文件夹中新建名为「.vscode」的文件夹,在其中新建全名为「extensions.json」的文件,并在其中加入如下代码。

  1. {
  2. "recommendations": [
  3. "jeff-hykin.better-cpp-syntax",
  4. "danielpinto8zz6.c-cpp-project-generator",
  5. "twxs.cmake",
  6. "ms-vscode.cmake-tools",
  7. "guyutongxue.cpp-reference",
  8. "llvm-vs-code-extensions.vscode-clangd",
  9. "ms-vscode.cpptools",
  10. "cheshirekow.cmake-format"
  11. ]
  12. }

如图所示

extensions.json

同样的,由左边栏进入「Extensions」,在搜索框中输入「@recommended」,即可得到我所推荐的插件。(然而还是只能一个一个点击安装)

注意:

  • 先安装「C/C++」再安装「clangd」安装完成后,会提示发生冲突(见下图),请选择「Disable IntelliSense」。
  • MSYS2 中安装的 clangd 存在一定问题,请在 VSCode 中通过「Ctrl + Shift + P」打开命令菜单,输入 clangd 并 选择「clangd: Download language server」安装插件提供的版本。
输入「@recommended」
冲突

-2- 配置配置文件

「VSCode」界面下,点击左下角的齿轮,选择「设置」,我们可以通过切换「用户」/「工作区」等,决定是为整个软件还是为单个工作区更改设置。

在右上角点击「打开设置」,可以切换到设置对应的 「settings.json」 文件。

这里我倾向于将尽量多的设置置于 VSCode 的配置文件中,以便于用账号同步设置,没有给 Clangd 等单独新建配置文件。

设置界面

如果阅读了安装插件并按照注意进行了操作,那么在 settings.json 中已经存在以下配置(路径可能不同):

  1. {
  2. "clangd.path": "c:\\Users\\FeignClaims\\AppData\\Roaming\\Code\\User\\globalStorage\\llvm-vs-code-extensions.vscode-clangd\\install\\12.0.1\\clangd_12.0.1\\bin\\clangd.exe",
  3. "C_Cpp.intelliSenseEngine": "Disabled"
  4. }

我们可以看到,配置行之间以英语输入法下的逗号「,」间隔,整个配置文件之外还会有一对大花括号,我们可以将鼠标停在"clangd.path"上,以查看配置说明

针对"clangd.path"一项,你也可以使用 「MSYS2 安装路径\\clang64\\bin\\clangd.exe」。

接下来我将贴出我的各插件及 VSCode 的部分配置及注释(注意添加逗号),你可以选择性地后附到自己的 settings.json 中。

我所使用的通用插件和 C/C++ 插件及其配置请见 -4-(可选)我所使用的VSCode插件-5-(可选)我所使用的VSCode配置。

VSCode

  1. /**********
  2. * VSCode *
  3. **********/
  4. "editor.unicodeHighlight.ambiguousCharacters": false,
  5. // 控制是否应在调试控制台中输入时接受建议; enter 还用于评估调试控制台中键入的任何内容
  6. "debug.console.acceptSuggestionOnEnter": "on",
  7. // 控制何时打开内部调试控制台
  8. "debug.internalConsoleOptions": "neverOpen",
  9. // 不允许 Enter 键处理输入时建议,避免换行与接受建议间的歧义
  10. // 你也可以允许该项,使用 Ctrl + Enter 进行换行
  11. "editor.acceptSuggestionOnEnter": "off",
  12. // 控制编辑器应当自动改写左引号或右引号
  13. "editor.autoClosingOvertype": "always",
  14. // 禁用自动检测文件缩进模式和缩进大小,即打开文件后自动将文件更改为 VSCode 配置的缩进格式
  15. "editor.detectIndentation": false,
  16. // 粘贴时格式化文件
  17. "editor.formatOnPaste": true,
  18. // 保存时格式化文件
  19. "editor.formatOnSave": true,
  20. // 在编辑器中自动显示内联建议
  21. "editor.inlineSuggest.enabled": true,
  22. // 是否在输入时显示含有参数文档和类型信息的小面板
  23. "editor.parameterHints.enabled": true,
  24. // 控制是否在键入代码时自动显示建议
  25. "editor.quickSuggestions": {
  26. // 键入注释时不允许
  27. "comments": false,
  28. // 键入其他时允许
  29. "other": true,
  30. // 键入字符串时不允许
  31. "strings": false
  32. },
  33. // 控制显示快速建议前的等待时间(毫秒)
  34. "editor.quickSuggestionsDelay": 0,
  35. // 控制编辑器在空白字符上显示符号的方式
  36. "editor.renderWhitespace": "none",
  37. // 代码片段建议置于其他建议之下
  38. "editor.snippetSuggestions": "bottom",
  39. // 使用空格缩进时模拟制表符的行为,可以方便对齐
  40. "editor.stickyTabStops": true,
  41. // 建议的接受方式
  42. "editor.suggest.insertMode": "replace",
  43. // 控制排序时是否提高靠近光标的词语的优先级
  44. "editor.suggest.localityBonus": true,
  45. "editor.suggest.shareSuggestSelections": true,
  46. // 控制建议小部件底部的状态栏可见
  47. "editor.suggest.showStatusBar": true,
  48. // 控制在键入触发字符后是否自动显示建议
  49. "editor.suggestOnTriggerCharacters": true,
  50. // 始终预先选择第一个建议
  51. "editor.suggestSelection": "first",
  52. // 一个制表符 = 2个空格
  53. "editor.tabSize": 2,
  54. // 控制是否根据文档中的文字提供建议列表
  55. "editor.wordBasedSuggestions": true,
  56. // 把文件删除时无需确认
  57. "explorer.confirmDelete": false,
  58. // 移动文件时无需确认
  59. "explorer.confirmDragAndDrop": false,
  60. // 粘贴同名文件时的重命名方式
  61. // smart: 在重复名称末尾智能地添加/递增数字
  62. "explorer.incrementalNaming": "smart",
  63. // 忽略扩展建议的通知
  64. "extensions.ignoreRecommendations": true,
  65. // 自动保存
  66. "files.autoSave": "afterDelay",
  67. // 自动保存的等待时间(毫秒)
  68. "files.autoSaveDelay": 1000,
  69. // 配置排除的文件和文件夹的glob模式
  70. // 文件资源管理器将根据此设置决定要显示或隐藏的文件和文件夹
  71. "files.exclude": {
  72. "**/.classpath": true,
  73. "**/.factorypath": true,
  74. "**/.project": true,
  75. "**/.settings": true
  76. },
  77. // 在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示
  78. // onExitAndWindowClose: 退出或窗口关闭时
  79. "files.hotExit": "onExitAndWindowClose",
  80. // Grunt 任务自动检测
  81. "grunt.autoDetect": "on",
  82. // Gulp 任务自动检测
  83. "gulp.autoDetect": "on",
  84. // 应该在何处显示单元格工具栏,或是否隐藏它
  85. "notebook.cellToolbarLocation": {
  86. // 默认: 右边
  87. "default": "right",
  88. // jupyter-notebook: 左边
  89. "jupyter-notebook": "left"
  90. },
  91. // 控制单元格编辑器中行号的显示
  92. "notebook.lineNumbers": "on",
  93. // 配置在搜索中排除的文件和文件夹的glob模式
  94. "search.exclude": {
  95. // "someFolder/": true,
  96. // "somefile": true
  97. },
  98. // 显示搜索结果所在行号
  99. "search.showLineNumbers": true,
  100. // 当搜索词为小写时,则不区分大小写进行搜索
  101. // 否则区分大小写
  102. "search.smartCase": true,
  103. // 集成终端默认为 PowerShell
  104. "terminal.integrated.defaultProfile.windows": "PowerShell",
  105. // 集成终端启用视觉化铃声
  106. "terminal.integrated.enableBell": true,
  107. // 集成终端编码: zh_CN.UTF-8
  108. "terminal.integrated.env.windows": {
  109. "LC_ALL": "zh_CN.UTF-8"
  110. },
  111. // 集成终端使用GPU加速
  112. "terminal.integrated.gpuAcceleration": "on",
  113. // 集成终端设置
  114. "terminal.integrated.profiles.windows": {
  115. "Command Prompt": {
  116. "args": [],
  117. "icon": "terminal-cmd",
  118. "path": [
  119. "${env:windir}\\Sysnative\\cmd.exe",
  120. "${env:windir}\\System32\\cmd.exe"
  121. ]
  122. },
  123. "Git Bash": {
  124. "source": "Git Bash"
  125. },
  126. "Msys2": {
  127. "args": ["-defterm", "-no-start", "-here"],
  128. "env": {
  129. "CHERE_INVOKING": "1",
  130. "MSYS2_PATH_TYPE": "inherit",
  131. "MSYSTEM": "CLANG64"
  132. },
  133. "path": ["C:\\msys64\\msys2_shell.cmd"]
  134. },
  135. "PowerShell": {
  136. "icon": "terminal-powershell",
  137. "source": "PowerShell"
  138. }
  139. },
  140. // 集成终端右击时选择光标下方的字词,并打开上下文菜单
  141. "terminal.integrated.rightClickBehavior": "selectWord",
  142. "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
  143. // 文件图标主题: 插件 vscode-icons
  144. "workbench.iconTheme": "vscode-icons",
  145. // 在没有从上一个会话恢复出信息的情况下,在启动时不打开编辑器
  146. "workbench.startupEditor": "none",
  147. // 显示视图头部的操作项
  148. "workbench.view.alwaysShowHeaderActions": true,
  149. "editor.largeFileOptimizations": false,
  150. "window.zoomLevel": 1

Clangd

  1. /**********
  2. * Clangd *
  3. **********/
  4. // 关闭 C/C++ 提供的 IntelliSenseEngine
  5. "C_Cpp.intelliSenseEngine": "Disabled",
  6. // Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
  7. "clangd.onConfigChanged": "restart",
  8. "clangd.arguments": [
  9. // 启用 Clang-Tidy 以提供「静态检查」
  10. "--clang-tidy",
  11. // compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
  12. "--compile-commands-dir=build",
  13. // 建议风格:打包(重载函数只会给出一个建议);反可以设置为detailed
  14. "--completion-style=bundled",
  15. /**
  16. * Read user and project configuration from YAML files.
  17. * Project config is from a .clangd file in the project directory.
  18. * User config is from clangd/config.yaml in the following directories:
  19. * Windows: %USERPROFILE%\AppData\Local
  20. * Mac OS: ~/Library/Preferences/
  21. * Others: $XDG_CONFIG_HOME, usually ~/.config
  22. *
  23. * 我所使用的配置:
  24. * Diagnostics:
  25. * ClangTidy:
  26. * Add: ["*"]
  27. * Remove:
  28. * [
  29. * abseil*,
  30. * altera*,
  31. * fuchsia*,
  32. * llvmlib*,
  33. * zircon*,
  34. * google-readability-todo,
  35. * readability-braces-around-statements,
  36. * hicpp-braces-around-statements,
  37. * ]
  38. * Index:
  39. * Background: Build
  40. */
  41. "--enable-config",
  42. // 默认格式化风格: 谷歌开源项目代码指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)
  43. "--fallback-style=Google",
  44. // 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
  45. // 我选择禁用
  46. "--function-arg-placeholders=false",
  47. // 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
  48. "--header-insertion-decorators",
  49. // 允许补充头文件
  50. "--header-insertion=iwyu",
  51. // 让 Clangd 生成更详细的日志
  52. "--log=verbose",
  53. // pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)
  54. "--pch-storage=memory",
  55. // 输出的 JSON 文件更美观
  56. "--pretty",
  57. // 建议排序模型
  58. "--ranking-model=heuristics",
  59. // 同时开启的任务数量
  60. "-j=12"
  61. ],
  62. // 自动检测 clangd 更新
  63. "clangd.checkUpdates": true,
  64. "clangd.path": "C:\\msys64\\clang64\\bin\\clangd.exe",
  65. // clangd的snippets有很多的跳转点,不用这个就必须手动触发Intellisense了
  66. "editor.suggest.snippetsPreventQuickSuggestions": false,

2021/10/20: 升级到「Clangd 13.0.0」后,「--clang-tidy-checks=<string>」已被废弃,请添加参数「--enable-config」,并在「%USERPROFILE%\AppData\Local\clangd」处创建文件「config.YAML」,并保存以下信息:

  1. Diagnostics:
  2. ClangTidy:
  3. Add: ["*"]
  4. Remove:
  5. [
  6. abseil*,
  7. fuchsia*,
  8. llvmlib*,
  9. zircon*,
  10. altera*,
  11. google-readability-todo,
  12. readability-braces-around-statements,
  13. hicpp-braces-around-statements,
  14. modernize-use-trailing-return-type,
  15. ]
  16. Index:
  17. Background: Build

CMake

  1. /*********
  2. * CMake *
  3. *********/
  4. // 保存 cmake.sourceDirectory 或 CMakeLists.txt 内容时,不自动配置 CMake 项目目录
  5. "cmake.configureOnEdit": false,
  6. // 在 CMake 项目目录打开时自动对其进行配置
  7. "cmake.configureOnOpen": true,
  8. // 成功配置后,将 compile_commands.json 复制到此位置
  9. "cmake.copyCompileCommands": "",

LLDB(详见 vscode-lldb 用户手册

  1. /********
  2. * LLDB *
  3. ********/
  4. // LLDB 指令自动补全
  5. "lldb.commandCompletions": true,
  6. // LLDB 指针显示解引用内容
  7. "lldb.dereferencePointers": true,
  8. // LLDB 鼠标悬停在变量上时预览变量值
  9. "lldb.evaluateForHovers": true,
  10. // LLDB 监视表达式的默认类型
  11. "lldb.launch.expressions": "simple",
  12. // LLDB 不显示汇编代码
  13. "lldb.showDisassembly": "never",
  14. // LLDB 生成更详细的日志
  15. "lldb.verboseLogging": true,

Git

  1. /*******
  2. * Git *
  3. *******/
  4. // 自动从当前 Git 存储库的默认远程库提取提交
  5. "git.autofetch": true,
  6. // 同步 Git 存储库前确认
  7. "git.confirmSync": false,
  8. // 没有暂存的更改时,直接提交全部更改
  9. "git.enableSmartCommit": true,

(可选)Fira Code 连字体及界面

效果图:

preview

首先,我们需要安装 Fira Code 字体

然后配置如下:

  1. /********
  2. * Font *
  3. ********/
  4. // 输出窗口
  5. "[Log]": {
  6. // 字体大小
  7. "editor.fontSize": 15
  8. },
  9. // CodeLens的字体系列: Fira Code Retina
  10. "editor.codeLensFontFamily": "Fira Code Retina",
  11. // 字体系列: Fira Code Retina
  12. "editor.fontFamily": "Fira Code Retina",
  13. // 启用连字体
  14. "editor.fontLigatures": true,
  15. // 字体大小
  16. "editor.fontSize": 16,
  17. // 集成终端字体大小
  18. "terminal.integrated.fontSize": 14,

(可选)多彩代码

  1. /*********
  2. * Color *
  3. *********/
  4. // 控制是否对括号着色
  5. "editor.bracketPairColorization.enabled": true,
  6. // 启用括号指导线
  7. "editor.guides.bracketPairs": true,
  8. // 语义高亮
  9. "editor.semanticHighlighting.enabled": true,
  10. // 语义高亮自定义
  11. "editor.semanticTokenColorCustomizations": {
  12. "enabled": true,
  13. "rules": {
  14. // 抽象符号
  15. "*.abstract": {
  16. "fontStyle": "italic"
  17. },
  18. // 只读量等效为宏
  19. "readonly": "#4FC1FF",
  20. // 静态量(静态变量,静态函数)
  21. "*.static": {
  22. "fontStyle": "bold"
  23. },
  24. // 宏
  25. "macro": {
  26. // "foreground": "#8F5DAF"
  27. "foreground": "#4FC1FF"
  28. },
  29. // 成员函数
  30. "method": {
  31. "fontStyle": "underline"
  32. },
  33. // 命名空间
  34. "namespace": {
  35. "foreground": "#00D780"
  36. },
  37. // 函数参数
  38. "parameter": {
  39. "foreground": "#C8ECFF"
  40. },
  41. // 只读的函数参数
  42. "parameter.readonly": {
  43. "foreground": "#7BD1FF"
  44. },
  45. // 成员变量,似乎需要clangd12以上
  46. "property": {
  47. "fontStyle": "underline",
  48. "foreground": "#C8ECFF"
  49. },
  50. // 类型参数
  51. "typeParameter": "#31A567",
  52. // 未启用的宏
  53. "comment": "#767BA6"
  54. }
  55. },
  56. // 括号颜色
  57. "workbench.colorCustomizations": {
  58. "[Default Dark+]": {
  59. "editorBracketHighlight.foreground3": "#9CDCFE",
  60. "editorBracketHighlight.foreground4": "#F3FD00",
  61. "editorBracketHighlight.foreground5": "#F47D9F",
  62. "editorBracketHighlight.foreground6": "#A5ADFE"
  63. }
  64. },

-3- 建立一个C++专用学习文件夹

还没完!如果我们现在编写一个 .cpp 文件,会发现连系统头文件都查找不了,原因在于我们没有告诉 Clangd 我们的编译器是什么,会有什么参数——更别提系统头文件路径了!

当然我们可以打开「设置」,在「Clangd: Fallback Flags」一项里告诉 Clangd 未找到「compile_commands.json」时编译器的默认参数应该是什么。

——但这样做无法成功让 Clangd 分析多文件项目。

我会在用 CMake 支撑框架一节介绍如何用 CMake 生成 compile_commands.json。

①建立文件结构

思路来自VSCode 配置 C/C++ 终极解决方案:vs code + clang + clangd + lldb (MacOS利用完整 clang-llvm 工具链)。 

文件夹命名规范源自 Google 开源项目代码指南,戳此为中文版,但翻译版本滞后,需注意。

当然,未用粗体标出的所有文件/文件夹名都可自定义。

我们在电脑某处新建一个文件夹「code」,专用于编程;在「code」文件夹中新建一个文件夹「cpp」,用于C++编程。

在「VSCode」中选择「文件」-「将文件夹添加到工作区...」,将「cpp」文件夹添加进来,此后我们可以通过「文件」-「工作区另存为...」来保存该工作区以便后序使用以及单独配置、安装插件等。

接下来我们按照自己的需要新建文件夹,比如:

我打算新建一个「practice」文件夹用于学习书上例题、习题,在「practice」内按照再书籍名称、目录细分子文件夹。

同时新建一个「gsl」文件夹,在里面存放「Cpp Core Guidelines」使用的轻量库GSL: Guidelines support library——一个只需包含头文件,无需链接的库。

(这里是为了说明,碰巧这个库在 MSYS2 中无法下载,你也可以下载后把「gsl」文件夹放在「MSYS2 安装路径\clang64\include」里作为「系统头文件」)

接下来我们考虑一件事:如何编译链接、调试代码?

虽然接下来会用 CMake 来管理整个工作区,但我并不打算借助CMake来负责编译链接代码(这也是个一旦入门就很简单的问题),CMake 在这里的作用仅仅是支撑框架、为 Clangd 提供「compile_commands.json」以分析多文件项目。

如果你想要学习如何通过CMake来进行编译、链接,请在看完本文章后,浏览最后的-7- 参考

我们在根目录新建文件夹「.vscode」,在其内新建全名为「tasks.json」(任务)和全名为「launch.json」(调试配置)的文件。

老样子,我会附出代码和对应注释,如果你想真正理解,就需要翻阅更多资料了

tasks.json:

额外的,对于 gsl 库,在参数中加入"-I${workspaceFolder}\\gsl"(-大写的i)(include)

由于 gsl 库只有头文件,故无需再参数中加入"-lgsl"(-小写的L)(link)来链接

  1. {
  2. "tasks": [
  3. {
  4. "type": "shell",
  5. "label": "Clang++: 编译单文件",
  6. // 编译器路径
  7. "command": "clang++",
  8. // 编译器后附的参数,反映在终端里即"clang+ arg1 arg2 arg3..."
  9. "args": [
  10. // 编译的文件
  11. "${fileDirname}\\${fileBasenameNoExtension}.cpp",
  12. // 生成文件到 build 文件夹中,文件名为debug.exe
  13. "-o",
  14. "${workspaceFolder}\\build\\test.exe",
  15. // 启用调试(debug)
  16. "-g",
  17. // 启用诊断
  18. "-pedantic",
  19. "-Wall",
  20. "-Wextra",
  21. // 多线程支持
  22. "-pthread",
  23. // 使用 LLVM lld 链接器而不是默认链接器
  24. "-fuse-ld=lld",
  25. // 检查内存越界和资源泄露
  26. "-fsanitize=address",
  27. "-fsanitize=undefined",
  28. // 分析所有注释(这其实只需告诉 Clangd ,即添加到 compile_commands.json 中)
  29. // Clang 默认只分析 Doxygen 风格("/**", "///"开头)的注释
  30. // "-fparse-all-comments",
  31. // 设置 C++ 的标准库为 libc++: Clang 对应的标准库
  32. "-stdlib=libc++",
  33. // 设置 C++ 版本为 c++20
  34. "-std=c++20",
  35. // 为给定环境生成代码
  36. "--target=x86_64-w64-mingw"
  37. ],
  38. "options": {
  39. // Clang 的启动路径
  40. "cwd": "${workspaceFolder}"
  41. },
  42. "problemMatcher": ["$gcc"],
  43. "group": {
  44. "kind": "build",
  45. "isDefault": true
  46. },
  47. "presentation": {
  48. "echo": true,
  49. // 执行任务时是否跳转到终端面板,可以为always,silent,never。具体参见VSC的文档,即使设为never,手动点进去还是可以看到
  50. "reveal": "always",
  51. // 设为true后可以使执行task时焦点聚集在终端,但对编译C/C++来说,设为true没有意义
  52. "focus": false,
  53. // 不同的文件的编译信息共享一个终端面板
  54. "panel": "shared"
  55. },
  56. "detail": "Clang++: 编译单个文件"
  57. },
  58. {
  59. "type": "shell",
  60. "label": "Clang++: 编译多文件",
  61. "command": "clang++",
  62. "args": [
  63. "${fileDirname}\\*.cpp",
  64. "-o",
  65. "${workspaceFolder}\\build\\test.exe",
  66. "-g",
  67. "-pedantic",
  68. "-Wall",
  69. "-Wextra",
  70. "-pthread",
  71. "-fuse-ld=lld",
  72. "-fsanitize=address",
  73. "-fsanitize=undefined",
  74. "-stdlib=libc++",
  75. "-std=c++20",
  76. "--target=x86_64-w64-mingw"
  77. ],
  78. "options": {
  79. "cwd": "${workspaceFolder}"
  80. },
  81. "problemMatcher": ["$gcc"],
  82. "group": {
  83. "kind": "build",
  84. "isDefault": true
  85. },
  86. "presentation": {
  87. "echo": true,
  88. "reveal": "always",
  89. "focus": false,
  90. "panel": "shared"
  91. },
  92. "detail": "Clang++: 编译当前文件所在目录里所有文件"
  93. }
  94. ],
  95. "version": "2.0.0"
  96. }

launch.json:

  1. {
  2. // 使用 IntelliSense 了解相关属性。
  3. // 悬停以查看现有属性的描述。
  4. // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  5. "version": "0.2.0",
  6. "configurations": [
  7. {
  8. "name": "LLDB: 生成和调试单文件",
  9. "type": "lldb",
  10. "request": "launch",
  11. "program": "${workspaceFolder}\\build\\test",
  12. "args": [],
  13. "stopOnEntry": false,
  14. "cwd": "${fileDirname}",
  15. "internalConsoleOptions": "neverOpen",
  16. "environment": [],
  17. "externalConsole": false,
  18. "setupCommands": [
  19. {
  20. "text": "settings set target.process.thread.step-avoid-regexp",
  21. "description": "Enable stepping into STL"
  22. },
  23. {
  24. "text": "settings set target.process.thread.step-avoid-libraries",
  25. "description": "Avoid stepping into libraries"
  26. }
  27. ],
  28. "preLaunchTask": "Clang++: 编译单文件"
  29. },
  30. {
  31. "name": "LLDB: 生成和调试多文件",
  32. "type": "lldb",
  33. "request": "launch",
  34. "program": "${workspaceFolder}\\build\\test",
  35. "args": [],
  36. "stopOnEntry": false,
  37. "cwd": "${fileDirname}",
  38. "internalConsoleOptions": "neverOpen",
  39. "environment": [],
  40. "externalConsole": false,
  41. "setupCommands": [
  42. {
  43. "text": "settings set target.process.thread.step-avoid-regexp",
  44. "description": "Enable stepping into STL"
  45. },
  46. {
  47. "text": "settings set target.process.thread.step-avoid-libraries",
  48. "description": "Avoid stepping into libraries"
  49. }
  50. ],
  51. "preLaunchTask": "Clang++: 编译多文件"
  52. },
  53. {
  54. "name": "LLDB: 调试已编译的 test.exe",
  55. "type": "lldb",
  56. "request": "launch",
  57. "program": "${workspaceFolder}\\build\\test",
  58. "args": [],
  59. "stopOnEntry": false,
  60. "cwd": "${fileDirname}",
  61. "internalConsoleOptions": "neverOpen",
  62. "environment": [],
  63. "externalConsole": false,
  64. "setupCommands": [
  65. {
  66. "text": "settings set target.process.thread.step-avoid-regexp",
  67. "description": "Enable stepping into STL"
  68. },
  69. {
  70. "text": "settings set target.process.thread.step-avoid-libraries",
  71. "description": "Avoid stepping into libraries"
  72. }
  73. ]
  74. }
  75. ]
  76. }

配置好后,你可以点击「终端」-「运行生成任务...」或Ctrl + Shift + B运行任务,这会同注释一样,编译你打开的文件,并输出为工作区根目录下的 debug.exe。

之后(或你可以同时进行),你可以点击「运行」-「启动调试」或 F5 进行调试,要更换调试配置,点击左侧「运行和调试」即可在侧边栏上方更改了。

更多的参数请参考 Visual Studio Code Variables Reference 和 Clang 编译器用户手册

②用 CMake 支撑框架

在我的理解下,「CMake」的配置是通过在各目录里添加名为「CMakeLists.txt」的文件,并在该文件中定义所在文件夹的信息完成的,所有信息都会被分析后储存在「build」文件夹中,同时生成编译器用以分析文件结构的「compile_commands.json」。

我们本节要做的事,就是借助 CMake 得到 compile_commands.json,以让 Clangd 发挥全部作用。

我们首先在工作区根目录新建一个这样的文件,并保存以下内容。在「CMakeLists.txt」中,注释是以「#」开头的。

  1. #要求 CMake 最低版本
  2. cmake_minimum_required(VERSION 3.0.0)
  3. #工程名称(根目录必须设置工程名称,设置相同工程名的文件将会被视作同一工程)
  4. project(cpp)
  5. #添加源外构建,增加 include 的搜索路径(类似于 C++ 添加头文件搜索路径)
  6. set(CMAKE_MODULE_PATH
  7. ${CMAKE_MODULE_PATH}
  8. ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules
  9. )
  10. #添加 basicEnv 文件中的内容(类似于 C++ 中的 #include
  11. include(basic_env)
  12. #添加子目录 practice,要求子目录也创建有 CMakeLists.txt
  13. #由于 gsl 目录中只含有头文件,不含有源文件,我们无需添加
  14. add_subdirectory(practice)

正如 6-9 行要求的,我们在工作区根目录下新建文件夹「cmake_modules」,在其中新建全名为「basic_env.cmake」的文件,在这里我们如「tasts.json」一样添加编译器参数。

  1. set(CMAKE_CXX_FLAGS
  2. "${CMAKE_CXX_FLAGS} -g -pthread -pedantic -Wall -Wextra -fsanitize=address -fsanitize=undefined -std=c++20 --target=x86_64-w64-mingw"
  3. )

进入「practice」文件夹中。每当我们进入一个文件夹,就询问自己:

这个文件夹里的内容,是属于同一个工程吗?

显然,「practice」文件夹是用于包含我们的读书子目录的,并不算作一个工程。

但基于根目录「CMakeLists.txt」的内容「add_subdirectory(practice)」,我们仍要为其新建一个「CMakeLists.txt」

就像前面说的,「practice」不是一个工程,我们也没必要给它一个工程名称。在「CMakeLists.txt」中我们唯一需要做的,就是通过「add_subdirectory(文件夹名)」将子目录加入 CMake 框架里。

我们已经到达概念上的「工程目录」了。

如果是真正的工程,我们可能需要深入每个目录,一个个添加上「CMakeLists.txt」

但我们只是为了获取「compile_commands.json」而已,而一本书与另一本书的例题、习题代码不太可能发生交互。所以我们在「工程目录」根目录下简单地添加「CMakeLists.txt」,并要求:

  • 这是一个工程
  • 目录里所有的源文件(这里是以 .cc 为后缀名的源文件)都会被编译成工程的执行文件
  • 目录里所有的头文件都可能被包含

例如,对于「c++_primer_plus」工程目录,我要求它的工程名为「c++_primer_plus」:

  1. #工程名称
  2. project(c++_primer_plus)
  3. #将所有以 .cpp 为后缀名的源文件添加到变量 src 中
  4. file(GLOB_RECURSE src "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
  5. #添加头文件可能的路径(系统头文件在 Clangd 知道编译器是什么的时候就确定了路径)
  6. include_directories(
  7. #根目录的 gsl 库
  8. ${CMAKE_SOURCE_DIR}/gsl
  9. )
  10. #将 src 对应的文件作为最终生成可执行文件的部分源文件
  11. #add_executable(工程名称 参数1 参数2 ...)
  12. #变量需要以${变量名}的形式引用
  13. add_executable(c++_primer_plus ${src})

如果你想偷点懒,也可以在「practice」文件夹下的「CMakeLists.txt」中配置这些内容。

但可能更麻烦。

关闭「VS Code」,重新打开该工作区,CMake将会自动搜索编译器,并对整个工作区进行配置。

如果没有搜索到,Ctrl + Shift + P 打开命令菜单,搜索「cmake」,并选择「CMake: 编辑用户本地 CMake 工具包」,并添加/替换以下信息:(其中编译器路径应当改为MSYS2安装路径)

  1. [
  2. {
  3. "name": "Clang 12.0.1 x86_64-w64-windows-gnu",
  4. "compilers": {
  5. "C": "C:\\msys64\\Clang64\\bin\\clang.exe",
  6. "CXX": "C:\\msys64\\Clang64\\bin\\clang++.exe"
  7. }
  8. }
  9. ]

由于我在设置中禁用了 CMake「保存时自动配置」(你也可以打开),当我们需要更新配置时,Ctrl + Shift + P 打开命令菜单,搜索「cmake」,并选择「CMake: 配置」。

此外,别忘了搜索「clangd」并选择「clangd: Restart language server」,让 Clangd 读取新的配置。

如果想要学习如何通过CMake来进行编译、链接,请在看完本文章后,浏览最后的-7- 参考

③用 Git 实现版本管理

什么是版本管理?你暂时可以认为版本管理是在备份我们的每一次修改,如果哪次修改不如意,你可以很简单地从中恢复过来。当然版本管理远不止这个用途

让 Git 忽略文件/文件夹

用 CMake 支撑框架一节,我们已经知道「.cache」文件夹是用于缓存 Clangd 分析出的信息,而每当我们启动「VSCode」或通过命令菜单手动「配置」时,「build」文件夹都会基于其他文件更新。——这两个文件夹根本没有备份的必要。

所以我们在工作区根目录新建全名为「.gitignore」的文件。在其中加入:

  1. /.cache/
  2. /build/

关于 .gitignore 的更多信息请参考 .gitignore

配置我们的 Git

首先我们要让 Git 认识我们。

新建一个终端(可参考-4- 常用快捷键 其他),键入以下内容:

  1. git config --global user.name "你的昵称"
  2. git config --global user.email "你的邮箱"

点击左侧「源代码管理」-「初始化存储库」。

你现在已经拥有一个接近专业的C++工作区了。


-4- 常用快捷键

越少从键盘切换到鼠标,我们的效率越高。

以下是部分常用快捷键(更多请参考 VSCode 快捷键 或 「文件」-「首选项」-「键盘快捷方式」):

插入行

  • Ctrl + Enter:在该行下方插入一行
  • Ctrl + Shift + Enter:在该行上方插入一行

行操作(可与 多光标和选取 搭配使用)

  • Ctrl + Shift + K:删除行
  • Alt + ↑/↓:移动行
  • Shift + Alt + ↑/↓:复制行

多光标和选取

  • Shift + ←/→:单字选取
  • Ctrl + Shift + ←/→:单词选取
  • Shift + Alt + ←/→:缩小/扩展选区
  • Ctrl + Alt + ↑/↓:在上/下方添加光标(无法撤销添加)
  • Ctrl + Shift + Alt + ↑/↓/←/→:块选择(也能添加光标且能撤销,选择到行尾后不会跳转到下一行)
  • Shift + Alt + i:在选择区域的各行末添加一个光标

其他

  • Ctrl + .:查看选中部分的快速修复(可配合 Ctrl + A 全选使用,也可以考虑直接使用 clang-tidy -fix,具体见官方文档
  • Shift + Alt + .:如果选中部分仅有一个可修复项,对选中部分自动修复
  • Ctrl + S:保存当前文件
  • Ctrl + Shift + P:打开命令菜单
  • Ctrl + B:切换侧边栏的可见性
  • Ctrl + Shift + B:运行生成任务
  • Ctrl + Space:手动触发建议
  • Ctrl + Shift + Space:手动触发参数提示
  • Ctrl + `(Tab上方的那个键):切换终端的可见性(如果没有终端,会新建一个)
  • F2:重命名符号
  • F5:使用当前配置调试
  • F12:转到定义
  • Ctrl + ↑/↓:上/下滚编辑器
  • Ctrl + F/H:搜索/替换
  • 按住Ctrl,鼠标左键:转到定义、跳转到对应文件
  • ……

-5-(可选)我所使用的VSCode插件

使用方法请见快速安装我所推荐的插件

通用插件

  1. {
  2. "recommendations": [
  3. "ms-vscode.azure-account",
  4. "ms-azuretools.vscode-azureappservice",
  5. "ms-azuretools.vscode-azureresourcegroups",
  6. "hookyqr.beautify",
  7. "aaron-bond.better-comments",
  8. "samuelcolvin.jinjahtml",
  9. "auchenberg.vscode-browser-preview",
  10. "ms-ceintl.vscode-language-pack-zh-hans",
  11. "formulahendry.code-runner",
  12. "adpyke.codesnap",
  13. "bierner.color-info",
  14. "randomfractalsinc.vscode-data-preview",
  15. "hediet.debug-visualizer",
  16. "ms-azuretools.vscode-docker",
  17. "cschlosser.doxdocgen",
  18. "editorconfig.editorconfig",
  19. "redvanworkshop.explorer-exclude-vscode-extension",
  20. "mkxml.vscode-filesize",
  21. "mhutchie.git-graph",
  22. "github.vscode-pull-request-github",
  23. "eamodio.gitlens",
  24. "kisstkondoros.vscode-gutter-preview",
  25. "wix.vscode-import-cost",
  26. "oderwat.indent-rainbow",
  27. "leetcode.vscode-leetcode",
  28. "ritwickdey.liveserver",
  29. "yzhang.markdown-all-in-one",
  30. "webfreak.debug",
  31. "eg2.vscode-npm-script",
  32. "christian-kohler.npm-intellisense",
  33. "techer.open-in-browser",
  34. "ibm.output-colorizer",
  35. "quicktype.quicktype",
  36. "christian-kohler.path-intellisense",
  37. "johnpapa.vscode-peacock",
  38. "esbenp.prettier-vscode",
  39. "chrmarti.regex",
  40. "humao.rest-client",
  41. "shan.code-settings-sync",
  42. "tyriar.sort-lines",
  43. "gruntfuggly.todo-tree",
  44. "chakrounanas.turbo-console-log",
  45. "visualstudioexptteam.vscodeintellicode",
  46. "deerawan.vscode-faker",
  47. "mikey.vscode-fileheader",
  48. "vscode-icons-team.vscode-icons",
  49. "jaspernorth.vscode-pigments",
  50. "wasteamaccount.webtemplatestudio-dev-nightly",
  51. "redhat.vscode-yaml",
  52. "appulate.filewatcher",
  53. "dbaeumer.vscode-eslint",
  54. "vadimcn.vscode-lldb",
  55. "codeinchinese.englishchinesedictionary",
  56. "alefragnani.bookmarks",
  57. "hbybyyang.gitee-vscode-plugin",
  58. "bbenoist.doxygen",
  59. "jbockle.jbockle-format-files",
  60. "njpwerner.autodocstring",
  61. "richie5um2.vscode-sort-json",
  62. "ms-toolsai.jupyter-keymap",
  63. "albymor.increment-selection",
  64. "shd101wyy.markdown-preview-enhanced",
  65. "nmsmith89.incrementor",
  66. "ms-toolsai.jupyter",
  67. "ms-toolsai.jupyter-renderers",
  68. "jkjustjoshing.vscode-text-pastry",
  69. "octref.vetur",
  70. "asvetliakov.vscode-neovim"
  71. ]
  72. }

C++插件

  1. {
  2. "recommendations": [
  3. "jeff-hykin.better-cpp-syntax",
  4. "danielpinto8zz6.c-cpp-project-generator",
  5. "twxs.cmake",
  6. "ms-vscode.cmake-tools",
  7. "guyutongxue.cpp-reference",
  8. "llvm-vs-code-extensions.vscode-clangd",
  9. "ms-vscode.cpptools",
  10. "cheshirekow.cmake-format",
  11. "jbenden.c-cpp-flylint"
  12. ]
  13. }

-6-(可选)我所使用的VSCode配置

使用方法请见配置配置文件

注意:配置中并没有给出Clangd的路径,请自行复制粘贴相关配置。

  1. {
  2. /**********
  3. * VSCode *
  4. **********/
  5. "editor.unicodeHighlight.ambiguousCharacters": false,
  6. // 控制是否应在调试控制台中输入时接受建议; enter 还用于评估调试控制台中键入的任何内容
  7. "debug.console.acceptSuggestionOnEnter": "on",
  8. // 控制何时打开内部调试控制台
  9. "debug.internalConsoleOptions": "neverOpen",
  10. // 不允许 Enter 键处理输入时建议,避免换行与接受建议间的歧义
  11. // 你也可以允许该项,使用 Ctrl + Enter 进行换行
  12. "editor.acceptSuggestionOnEnter": "off",
  13. // 控制编辑器应当自动改写左引号或右引号
  14. "editor.autoClosingOvertype": "always",
  15. // 禁用自动检测文件缩进模式和缩进大小,即打开文件后自动将文件更改为 VSCode 配置的缩进格式
  16. "editor.detectIndentation": false,
  17. // 粘贴时格式化文件
  18. "editor.formatOnPaste": true,
  19. // 保存时格式化文件
  20. "editor.formatOnSave": true,
  21. // 在编辑器中自动显示内联建议
  22. "editor.inlineSuggest.enabled": true,
  23. // 是否在输入时显示含有参数文档和类型信息的小面板
  24. "editor.parameterHints.enabled": true,
  25. // 控制是否在键入代码时自动显示建议
  26. "editor.quickSuggestions": {
  27. // 键入注释时不允许
  28. "comments": false,
  29. // 键入其他时允许
  30. "other": true,
  31. // 键入字符串时不允许
  32. "strings": false
  33. },
  34. // 控制显示快速建议前的等待时间(毫秒)
  35. "editor.quickSuggestionsDelay": 0,
  36. // 控制编辑器在空白字符上显示符号的方式
  37. "editor.renderWhitespace": "none",
  38. // 代码片段建议置于其他建议之下
  39. "editor.snippetSuggestions": "bottom",
  40. // 使用空格缩进时模拟制表符的行为,可以方便对齐
  41. "editor.stickyTabStops": true,
  42. // 建议的接受方式
  43. "editor.suggest.insertMode": "replace",
  44. // 控制排序时是否提高靠近光标的词语的优先级
  45. "editor.suggest.localityBonus": true,
  46. "editor.suggest.shareSuggestSelections": true,
  47. // 控制建议小部件底部的状态栏可见
  48. "editor.suggest.showStatusBar": true,
  49. // 控制在键入触发字符后是否自动显示建议
  50. "editor.suggestOnTriggerCharacters": true,
  51. // 始终预先选择第一个建议
  52. "editor.suggestSelection": "first",
  53. // 一个制表符 = 2个空格
  54. "editor.tabSize": 2,
  55. // 控制是否根据文档中的文字提供建议列表
  56. "editor.wordBasedSuggestions": true,
  57. // 把文件删除时无需确认
  58. "explorer.confirmDelete": false,
  59. // 移动文件时无需确认
  60. "explorer.confirmDragAndDrop": false,
  61. // 粘贴同名文件时的重命名方式
  62. // smart: 在重复名称末尾智能地添加/递增数字
  63. "explorer.incrementalNaming": "smart",
  64. // 忽略扩展建议的通知
  65. "extensions.ignoreRecommendations": true,
  66. // 自动保存
  67. "files.autoSave": "afterDelay",
  68. // 自动保存的等待时间(毫秒)
  69. "files.autoSaveDelay": 1000,
  70. // 配置排除的文件和文件夹的glob模式
  71. // 文件资源管理器将根据此设置决定要显示或隐藏的文件和文件夹
  72. "files.exclude": {
  73. "**/.classpath": true,
  74. "**/.factorypath": true,
  75. "**/.project": true,
  76. "**/.settings": true
  77. },
  78. // 在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示
  79. // onExitAndWindowClose: 退出或窗口关闭时
  80. "files.hotExit": "onExitAndWindowClose",
  81. // Grunt 任务自动检测
  82. "grunt.autoDetect": "on",
  83. // Gulp 任务自动检测
  84. "gulp.autoDetect": "on",
  85. // 应该在何处显示单元格工具栏,或是否隐藏它
  86. "notebook.cellToolbarLocation": {
  87. // 默认: 右边
  88. "default": "right",
  89. // jupyter-notebook: 左边
  90. "jupyter-notebook": "left"
  91. },
  92. // 控制单元格编辑器中行号的显示
  93. "notebook.lineNumbers": "on",
  94. // 配置在搜索中排除的文件和文件夹的glob模式
  95. "search.exclude": {
  96. // "someFolder/": true,
  97. // "somefile": true
  98. },
  99. // 显示搜索结果所在行号
  100. "search.showLineNumbers": true,
  101. // 当搜索词为小写时,则不区分大小写进行搜索
  102. // 否则区分大小写
  103. "search.smartCase": true,
  104. // 集成终端默认为 PowerShell
  105. "terminal.integrated.defaultProfile.windows": "PowerShell",
  106. // 集成终端启用视觉化铃声
  107. "terminal.integrated.enableBell": true,
  108. // 集成终端编码: zh_CN.UTF-8
  109. "terminal.integrated.env.windows": {
  110. "LC_ALL": "zh_CN.UTF-8"
  111. },
  112. // 集成终端使用GPU加速
  113. "terminal.integrated.gpuAcceleration": "on",
  114. // 集成终端设置
  115. "terminal.integrated.profiles.windows": {
  116. "Command Prompt": {
  117. "args": [],
  118. "icon": "terminal-cmd",
  119. "path": [
  120. "${env:windir}\\Sysnative\\cmd.exe",
  121. "${env:windir}\\System32\\cmd.exe"
  122. ]
  123. },
  124. "Git Bash": {
  125. "source": "Git Bash"
  126. },
  127. "Msys2": {
  128. "args": ["-defterm", "-no-start", "-here"],
  129. "env": {
  130. "CHERE_INVOKING": "1",
  131. "MSYS2_PATH_TYPE": "inherit",
  132. "MSYSTEM": "CLANG64"
  133. },
  134. "path": ["C:\\msys64\\msys2_shell.cmd"]
  135. },
  136. "PowerShell": {
  137. "icon": "terminal-powershell",
  138. "source": "PowerShell"
  139. }
  140. },
  141. // 集成终端右击时选择光标下方的字词,并打开上下文菜单
  142. "terminal.integrated.rightClickBehavior": "selectWord",
  143. "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
  144. // 文件图标主题: 插件 vscode-icons
  145. "workbench.iconTheme": "vscode-icons",
  146. // 在没有从上一个会话恢复出信息的情况下,在启动时不打开编辑器
  147. "workbench.startupEditor": "none",
  148. // 显示视图头部的操作项
  149. "workbench.view.alwaysShowHeaderActions": true,
  150. "editor.largeFileOptimizations": false,
  151. "window.zoomLevel": 1
  152. /********
  153. * Font *
  154. ********/
  155. // 输出窗口
  156. "[Log]": {
  157. // 字体大小
  158. "editor.fontSize": 15
  159. },
  160. // CodeLens的字体系列: Fira Code Retina
  161. "editor.codeLensFontFamily": "Fira Code Retina",
  162. // 字体系列: Fira Code Retina
  163. "editor.fontFamily": "Fira Code Retina",
  164. // 启用连字体
  165. "editor.fontLigatures": true,
  166. // 字体大小
  167. "editor.fontSize": 16,
  168. // 集成终端字体大小
  169. "terminal.integrated.fontSize": 14,
  170. /*********
  171. * Color *
  172. *********/
  173. // 控制是否对括号着色
  174. "editor.bracketPairColorization.enabled": true,
  175. // 启用括号指导线
  176. "editor.guides.bracketPairs": true,
  177. // 语义高亮
  178. "editor.semanticHighlighting.enabled": true,
  179. // 语义高亮自定义
  180. "editor.semanticTokenColorCustomizations": {
  181. "enabled": true,
  182. "rules": {
  183. // 抽象符号
  184. "*.abstract": {
  185. "fontStyle": "italic"
  186. },
  187. // 只读量等效为宏
  188. "readonly": "#4FC1FF",
  189. // 静态量(静态变量,静态函数)
  190. "*.static": {
  191. "fontStyle": "bold"
  192. },
  193. // 宏
  194. "macro": {
  195. // "foreground": "#8F5DAF"
  196. "foreground": "#4FC1FF"
  197. },
  198. // 成员函数
  199. "method": {
  200. "fontStyle": "underline"
  201. },
  202. // 命名空间
  203. "namespace": {
  204. "foreground": "#00D780"
  205. },
  206. // 函数参数
  207. "parameter": {
  208. "foreground": "#C8ECFF"
  209. },
  210. // 只读的函数参数
  211. "parameter.readonly": {
  212. "foreground": "#7BD1FF"
  213. },
  214. // 成员变量,似乎需要clangd12以上
  215. "property": {
  216. "fontStyle": "underline",
  217. "foreground": "#C8ECFF"
  218. },
  219. // 类型参数
  220. "typeParameter": "#31A567",
  221. // 未启用的宏
  222. "comment": "#767BA6"
  223. }
  224. },
  225. // 括号颜色
  226. "workbench.colorCustomizations": {
  227. "[Default Dark+]": {
  228. "editorBracketHighlight.foreground3": "#9CDCFE",
  229. "editorBracketHighlight.foreground4": "#F3FD00",
  230. "editorBracketHighlight.foreground5": "#F47D9F",
  231. "editorBracketHighlight.foreground6": "#A5ADFE"
  232. }
  233. },
  234. /**********
  235. * Format *
  236. **********/
  237. "[jsonc]": {
  238. "editor.defaultFormatter": "esbenp.prettier-vscode"
  239. },
  240. /*******
  241. * Git *
  242. *******/
  243. // 自动从当前 Git 存储库的默认远程库提取提交
  244. "git.autofetch": true,
  245. // 同步 Git 存储库前确认
  246. "git.confirmSync": false,
  247. // 没有暂存的更改时,直接提交全部更改
  248. "git.enableSmartCommit": true,
  249. /**********
  250. * Clangd *
  251. **********/
  252. // 关闭 C/C++ 提供的 IntelliSenseEngine
  253. "C_Cpp.intelliSenseEngine": "Disabled",
  254. // Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
  255. "clangd.onConfigChanged": "restart",
  256. "clangd.arguments": [
  257. // 启用 Clang-Tidy 以提供「静态检查」
  258. "--clang-tidy",
  259. // compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
  260. "--compile-commands-dir=build",
  261. // 建议风格:打包(重载函数只会给出一个建议);反可以设置为detailed
  262. "--completion-style=bundled",
  263. /**
  264. * Read user and project configuration from YAML files.
  265. * Project config is from a .clangd file in the project directory.
  266. * User config is from clangd/config.yaml in the following directories:
  267. * Windows: %USERPROFILE%\AppData\Local
  268. * Mac OS: ~/Library/Preferences/
  269. * Others: $XDG_CONFIG_HOME, usually ~/.config
  270. *
  271. * 我所使用的配置:
  272. * Diagnostics:
  273. * ClangTidy:
  274. * Add: ["*"]
  275. * Remove:
  276. * [
  277. * abseil*,
  278. * altera*,
  279. * fuchsia*,
  280. * llvmlib*,
  281. * zircon*,
  282. * google-readability-todo,
  283. * readability-braces-around-statements,
  284. * hicpp-braces-around-statements,
  285. * ]
  286. * Index:
  287. * Background: Build
  288. */
  289. "--enable-config",
  290. // 默认格式化风格: 谷歌开源项目代码指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)
  291. "--fallback-style=Google",
  292. // 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
  293. // 我选择禁用
  294. "--function-arg-placeholders=false",
  295. // 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
  296. "--header-insertion-decorators",
  297. // 允许补充头文件
  298. "--header-insertion=iwyu",
  299. // 让 Clangd 生成更详细的日志
  300. "--log=verbose",
  301. // pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)
  302. "--pch-storage=memory",
  303. // 输出的 JSON 文件更美观
  304. "--pretty",
  305. // 建议排序模型
  306. "--ranking-model=heuristics",
  307. // 同时开启的任务数量
  308. "-j=12"
  309. ],
  310. // 自动检测 clangd 更新
  311. "clangd.checkUpdates": true,
  312. "clangd.path": "C:\\msys64\\clang64\\bin\\clangd.exe",
  313. // clangd的snippets有很多的跳转点,不用这个就必须手动触发Intellisense了
  314. "editor.suggest.snippetsPreventQuickSuggestions": false,
  315. /*********
  316. * CMake *
  317. *********/
  318. // 保存 cmake.sourceDirectory 或 CMakeLists.txt 内容时,不自动配置 CMake 项目目录
  319. "cmake.configureOnEdit": false,
  320. // 在 CMake 项目目录打开时自动对其进行配置
  321. "cmake.configureOnOpen": true,
  322. // 成功配置后,将 compile_commands.json 复制到此位置
  323. "cmake.copyCompileCommands": "",
  324. /********
  325. * LLDB *
  326. ********/
  327. // LLDB 指令自动补全
  328. "lldb.commandCompletions": true,
  329. // LLDB 指针显示解引用内容
  330. "lldb.dereferencePointers": true,
  331. // LLDB 鼠标悬停在变量上时预览变量值
  332. "lldb.evaluateForHovers": true,
  333. // LLDB 监视表达式的默认类型
  334. "lldb.launch.expressions": "simple",
  335. // LLDB 不显示汇编代码
  336. "lldb.showDisassembly": "never",
  337. // LLDB 生成更详细的日志
  338. "lldb.verboseLogging": true,
  339. /**************
  340. * Extensions *
  341. **************/
  342. "better-comments.highlightPlainText": true,
  343. "better-comments.multilineComments": true,
  344. "better-comments.tags": [
  345. {
  346. "backgroundColor": "transparent",
  347. "bold": false,
  348. "color": "#DC143C",
  349. "italic": false,
  350. "strikethrough": false,
  351. "tag": "bug:",
  352. "underline": false
  353. },
  354. {
  355. "backgroundColor": "transparent",
  356. "bold": false,
  357. "color": "#DC143C",
  358. "italic": false,
  359. "strikethrough": false,
  360. "tag": "\\$",
  361. "underline": false
  362. },
  363. {
  364. "backgroundColor": "transparent",
  365. "bold": false,
  366. "color": "#008000",
  367. "italic": false,
  368. "strikethrough": false,
  369. "tag": "done:",
  370. "underline": false
  371. },
  372. {
  373. "backgroundColor": "transparent",
  374. "bold": false,
  375. "color": "#008000",
  376. "italic": false,
  377. "strikethrough": false,
  378. "tag": "\\;",
  379. "underline": false
  380. },
  381. {
  382. "backgroundColor": "transparent",
  383. "bold": false,
  384. "color": "#4169E1",
  385. "italic": false,
  386. "strikethrough": false,
  387. "tag": "fixme:",
  388. "underline": false
  389. },
  390. {
  391. "backgroundColor": "transparent",
  392. "bold": false,
  393. "color": "#4169E1",
  394. "italic": false,
  395. "strikethrough": false,
  396. "tag": "\\%",
  397. "underline": false
  398. },
  399. {
  400. "backgroundColor": "transparent",
  401. "bold": false,
  402. "color": "#DEB887",
  403. "italic": false,
  404. "strikethrough": false,
  405. "tag": "note:",
  406. "underline": false
  407. },
  408. {
  409. "backgroundColor": "transparent",
  410. "bold": false,
  411. "color": "#DEB887",
  412. "italic": false,
  413. "strikethrough": false,
  414. "tag": "\\]",
  415. "underline": false
  416. },
  417. {
  418. "backgroundColor": "transparent",
  419. "bold": false,
  420. "color": "#FFD700",
  421. "italic": false,
  422. "strikethrough": false,
  423. "tag": "star:",
  424. "underline": false
  425. },
  426. {
  427. "backgroundColor": "transparent",
  428. "bold": false,
  429. "color": "#FFD700",
  430. "italic": false,
  431. "strikethrough": false,
  432. "tag": "\\*",
  433. "underline": false
  434. },
  435. {
  436. "backgroundColor": "transparent",
  437. "bold": false,
  438. "color": "#FF2C00",
  439. "italic": false,
  440. "strikethrough": false,
  441. "tag": "alert:",
  442. "underline": false
  443. },
  444. {
  445. "backgroundColor": "transparent",
  446. "bold": false,
  447. "color": "#FF2C00",
  448. "italic": false,
  449. "strikethrough": false,
  450. "tag": "\\!",
  451. "underline": false
  452. },
  453. {
  454. "backgroundColor": "transparent",
  455. "bold": false,
  456. "color": "#3498DB",
  457. "italic": false,
  458. "strikethrough": false,
  459. "tag": "question:",
  460. "underline": false
  461. },
  462. {
  463. "backgroundColor": "transparent",
  464. "bold": false,
  465. "color": "#3498DB",
  466. "italic": false,
  467. "strikethrough": false,
  468. "tag": "\\?",
  469. "underline": false
  470. },
  471. {
  472. "backgroundColor": "transparent",
  473. "bold": false,
  474. "color": "#FF8C00",
  475. "italic": false,
  476. "strikethrough": false,
  477. "tag": "todo:",
  478. "underline": false
  479. },
  480. {
  481. "backgroundColor": "transparent",
  482. "bold": false,
  483. "color": "#FF8C00",
  484. "italic": false,
  485. "strikethrough": false,
  486. "tag": "\\>",
  487. "underline": false
  488. }
  489. ],
  490. // Code Runner 执行命令,考虑到一致性,可执行文件输出到build文件夹中,命名为debug
  491. "code-runner.executorMap": {
  492. "cpp": "cd $dir && clang++ $fileName -pedantic -Wall -Wextra -pthread -fuse-ld=lld -fsanitize=address -fsanitize=undefined -stdlib=libc++ -std=c++20 --target=x86_64-w64-mingw -o $workspaceRoot\\build\\test && $workspaceRoot\\build\\test"
  493. },
  494. // Code Runner 在终端中运行
  495. "code-runner.runInTerminal": true,
  496. // doxygen 使用 Git 中配置的用户邮箱
  497. "doxdocgen.generic.useGitUserEmail": true,
  498. // doxygen 使用 Git 中配置的用户名
  499. "doxdocgen.generic.useGitUserName": true,
  500. // 缩进彩虹更新等待时间(毫秒)
  501. "indentRainbow.updateDelay": 0,
  502. // Jack 任务自动检测
  503. "jake.autoDetect": "on",
  504. // 授权向 Red Hat 服务器上传使用数据和错误
  505. "redhat.telemetry.enabled": true,
  506. "todo-tree.filtering.excludeGlobs": ["build", "data"],
  507. "todo-tree.general.tagGroups": {
  508. "ALERT": ["ALERT:"],
  509. "BUG": ["BUG:"],
  510. "DONE": ["DONE:"],
  511. "FIXME": ["FIXME:"],
  512. "NOTE": ["NOTE:"],
  513. "QUESTION": ["QUESTION:"],
  514. "STAR": ["STAR:"],
  515. "TODO": ["TODO:", "TODO(www41):"]
  516. },
  517. "todo-tree.general.tags": [
  518. "ALERT:",
  519. "QUESTION:",
  520. "TODO:",
  521. "TODO(www41):",
  522. "DONE:",
  523. "FIXME:",
  524. "BUG:",
  525. "NOTE:",
  526. "STAR:",
  527. "alert:",
  528. "question:",
  529. "todo:",
  530. "done:",
  531. "fixme:",
  532. "bug:",
  533. "note:",
  534. "star:"
  535. ],
  536. "todo-tree.highlights.customHighlight": {
  537. "ALERT": {
  538. "background": "#FF2C00",
  539. "foreground": "#FFFAFA",
  540. "icon": "alert",
  541. "iconColour": "#FF2C00",
  542. "rulerColour": "#FF2C00"
  543. },
  544. "BUG": {
  545. "background": "#DC143C",
  546. "foreground": "#FFFAFA",
  547. "iconColour": "#DC143C",
  548. "rulerColour": "#DC143C"
  549. },
  550. "DONE": {
  551. "background": "#008000",
  552. "foreground": "#FFFAFA",
  553. "icon": "check-circle-fill",
  554. "iconColour": "#008000",
  555. "rulerColour": "#008000"
  556. },
  557. "FIXME": {
  558. "background": "#4169E1",
  559. "foreground": "#FFFAFA",
  560. "icon": "gear",
  561. "iconColour": "#4169E1",
  562. "rulerColour": "#4169E1"
  563. },
  564. "NOTE": {
  565. "background": "#DEB887",
  566. "foreground": "#000000",
  567. "icon": "bookmark-fill",
  568. "iconColour": "#DEB887",
  569. "rulerColour": "#DEB887"
  570. },
  571. "QUESTION": {
  572. "background": "#3498DB",
  573. "foreground": "#FFFAFA",
  574. "icon": "question",
  575. "iconColour": "#3498DB",
  576. "rulerColour": "#3498DB"
  577. },
  578. "STAR": {
  579. "background": "#FFD700",
  580. "foreground": "#3E13AF",
  581. "icon": "star-fill",
  582. "iconColour": "#FFD700",
  583. "rulerColour": "#FFD700"
  584. },
  585. "TODO": {
  586. "background": "#FF8C00",
  587. "foreground": "#FFFAFA",
  588. "iconColour": "#FF8C00",
  589. "rulerColour": "#FF8C00"
  590. },
  591. "alert:": {
  592. "background": "#FF2C00",
  593. "foreground": "#FFFAFA",
  594. "hideFromTree": true,
  595. "icon": "alert",
  596. "iconColour": "#FF2C00",
  597. "rulerColour": "#FF2C00"
  598. },
  599. "bug:": {
  600. "background": "#DC143C",
  601. "foreground": "#FFFAFA",
  602. "hideFromTree": true,
  603. "iconColour": "#DC143C",
  604. "rulerColour": "#DC143C"
  605. },
  606. "done:": {
  607. "background": "#008000",
  608. "foreground": "#FFFAFA",
  609. "hideFromTree": true,
  610. "icon": "check-circle-fill",
  611. "iconColour": "#008000",
  612. "rulerColour": "#008000"
  613. },
  614. "fixme:": {
  615. "background": "#4169E1",
  616. "foreground": "#FFFAFA",
  617. "hideFromTree": true,
  618. "icon": "gear",
  619. "iconColour": "#4169E1",
  620. "rulerColour": "#4169E1"
  621. },
  622. "note:": {
  623. "background": "#DEB887",
  624. "foreground": "#000000",
  625. "hideFromTree": true,
  626. "icon": "bookmark-fill",
  627. "iconColour": "#DEB887",
  628. "rulerColour": "#DEB887"
  629. },
  630. "question:": {
  631. "background": "#3498DB",
  632. "foreground": "#FFFAFA",
  633. "hideFromTree": true,
  634. "icon": "question",
  635. "iconColour": "#3498DB",
  636. "rulerColour": "#3498DB"
  637. },
  638. "star:": {
  639. "background": "#FFD700",
  640. "foreground": "#3E13AF",
  641. "hideFromTree": true,
  642. "icon": "star-fill",
  643. "iconColour": "#FFD700",
  644. "rulerColour": "#FFD700"
  645. },
  646. "todo:": {
  647. "background": "#FF8C00",
  648. "foreground": "#FFFAFA",
  649. "hideFromTree": true,
  650. "iconColour": "#FF8C00",
  651. "rulerColour": "#FF8C00"
  652. }
  653. },
  654. "todo-tree.highlights.defaultHighlight": {
  655. "rulerLane": "left",
  656. "type": "tag"
  657. },
  658. "todo-tree.regex.regex": "((\\**|//|#|<!--|;|/\\*|^)\\s*($TAGS)(\\([\\w]+\\))?:?|^\\s*- \\[ \\])"
  659. }

-7- 参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/239964
推荐阅读
相关标签
  

闽ICP备14008679号