• VSCode 配置 C/C++:VSCode + Clang + Clangd + LLDB + CMake + Git


    -1- 前言

    ①目的

            我于今年4月开学习CS,前几月一直使用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
    2.  
      pacman -S mingw-w64-clang-x86_64-cninja
    3.  
      pacman -S mingw-w64-clang-x86_64-python-six
    4.  
      pacman -S mingw-w64-clang-x86_64-python-pip
    5.  
      pacman -S mingw-w64-clang-x86_64-benchmark
    6.  
      pip install cmake_format
    7.  
      pacman -Syu
    8.  
      pacman -Syu

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

    ⑥在 VSCode 中安装需要的插件

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

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

    快速安装我所推荐插件 

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

    1.  
      {
    2.  
      "recommendations": [
    3.  
      "llvm-vs-code-extensions.vscode-clangd",
    4.  
      "vadimcn.vscode-lldb",
    5.  
      "ms-vscode.cpptools",
    6.  
      "twxs.cmake",
    7.  
      "ms-vscode.cmake-tools",
    8.  
      "cheshirekow.cmake-format"
    9.  
      ]
    10.  
      }

    如图所示

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

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

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

    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\\debug",
    12.  
      "args": [],
    13.  
      "stopOnEntry": false,
    14.  
      "cwd": "${fileDirname}",
    15.  
      "internalConsoleOptions": "neverOpen",
    16.  
      "environment": [],
    17.  
      "externalConsole": false,
    18.  
      "preLaunchTask": "Clang++: 编译单文件"
    19.  
      },
    20.  
      {
    21.  
      "name": "LLDB: 生成和调试多文件",
    22.  
      "type": "lldb",
    23.  
      "request": "launch",
    24.  
      "program": "${workspaceFolder}\\build\\debug",
    25.  
      "args": [],
    26.  
      "stopOnEntry": false,
    27.  
      "cwd": "${fileDirname}",
    28.  
      "internalConsoleOptions": "neverOpen",
    29.  
      "environment": [],
    30.  
      "externalConsole": false,
    31.  
      "preLaunchTask": "Clang++: 编译多文件"
    32.  
      },
    33.  
      {
    34.  
      "name": "LLDB: 调试已编译的 debug.exe",
    35.  
      "type": "lldb",
    36.  
      "request": "launch",
    37.  
      "program": "${workspaceFolder}\\build\\debug",
    38.  
      "args": [],
    39.  
      "stopOnEntry": false,
    40.  
      "cwd": "${fileDirname}",
    41.  
      "internalConsoleOptions": "neverOpen",
    42.  
      "environment": [],
    43.  
      "externalConsole": false,
    44.  
      }
    45.  
      ]
    46.  
      }

    配置好后,你可以点击「终端」-「运行生成任务...」或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.  
       
    6.  
      #添加源外构建,增加 include 的搜索路径(类似于 C++ 添加头文件搜索路径)
    7.  
      set(CMAKE_MODULE_PATH
    8.  
      ${CMAKE_MODULE_PATH}
    9.  
      ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules
    10.  
      )
    11.  
      #添加 basicEnv 文件中的内容(类似于 C++ 中的 #include)
    12.  
      include(basic_env)
    13.  
       
    14.  
      #添加子目录 practice,要求子目录也创建有 CMakeLists.txt
    15.  
      #由于 gsl 目录中只含有头文件,不含有源文件,我们无需添加
    16.  
      add_subdirectory(practice)

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

    1.  
      set(CMAKE_CXX_FLAGS
    2.  
      "${CMAKE_CXX_FLAGS}
    3.  
      -g
    4.  
      -pthread
    5.  
      -fuse-ld=lld
    6.  
      -fstandalone-debug
    7.  
      -Wall
    8.  
      -Wextra
    9.  
      -fcolor-diagnostics
    10.  
      -fparse-all-comments
    11.  
      -stdlib=libc++
    12.  
      -std=c++20
    13.  
      --target=x86_64-w64-mingw"
    14.  
      )

    进入「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.  
       
    4.  
      #将所有以 .cc 为后缀名的源文件添加到变量 src 中
    5.  
      #如果你需要 .cpp 为后缀名,可以模仿此格式,但变量不可重复
    6.  
      file(GLOB_RECURSE src "${CMAKE_CURRENT_SOURCE_DIR}/*.cc")
    7.  
       
    8.  
      #添加头文件可能的路径(系统头文件在 Clangd 知道编译器是什么的时候就确定了路径)
    9.  
      include_directories(
    10.  
      #根目录的 gsl 库
    11.  
      ${CMAKE_SOURCE_DIR}/gsl
    12.  
      )
    13.  
       
    14.  
      #将 src 对应的文件作为最终生成可执行文件的部分源文件
    15.  
      #add_executable(工程名称 参数1 参数2 ...)
    16.  
      #变量需要以${变量名}的形式引用
    17.  
      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 + .:查看选中部分的快速修复
    • 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.  
      "spywhere.guides",
    25.  
      "kisstkondoros.vscode-gutter-preview",
    26.  
      "wix.vscode-import-cost",
    27.  
      "oderwat.indent-rainbow",
    28.  
      "leetcode.vscode-leetcode",
    29.  
      "ritwickdey.liveserver",
    30.  
      "yzhang.markdown-all-in-one",
    31.  
      "webfreak.debug",
    32.  
      "eg2.vscode-npm-script",
    33.  
      "christian-kohler.npm-intellisense",
    34.  
      "techer.open-in-browser",
    35.  
      "ibm.output-colorizer",
    36.  
      "quicktype.quicktype",
    37.  
      "christian-kohler.path-intellisense",
    38.  
      "johnpapa.vscode-peacock",
    39.  
      "esbenp.prettier-vscode",
    40.  
      "chrmarti.regex",
    41.  
      "humao.rest-client",
    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.  
      ]
    71.  
      }

    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.  
      ]
    11.  
      }

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

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

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

    1.  
      {
    2.  
      /**********
    3.  
      * VSCode *
    4.  
      **********/
    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": "top",
    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.rightClickBehavior": "selectWord",
    115.  
      "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    116.  
      // 窗口缩放级别: 1(原始级别为 0)
    117.  
      "window.zoomLevel": 1,
    118.  
      // 文件图标主题: 插件 vscode-icons
    119.  
      "workbench.iconTheme": "vscode-icons",
    120.  
      // 在没有从上一个会话恢复出信息的情况下,在启动时不打开编辑器
    121.  
      "workbench.startupEditor": "none",
    122.  
      // 显示视图头部的操作项
    123.  
      "workbench.view.alwaysShowHeaderActions": true,
    124.  
       
    125.  
      /********
    126.  
      * Font *
    127.  
      ********/
    128.  
      // 输出窗口
    129.  
      "[Log]": {
    130.  
      // 字体大小
    131.  
      "editor.fontSize": 15
    132.  
      },
    133.  
      // CodeLens的字体系列: Fira Code Two iScript
    134.  
      "editor.codeLensFontFamily": "Fira Code",
    135.  
      // 字体系列: Fira Code Two iScript
    136.  
      "editor.fontFamily": "Fira Code",
    137.  
      // 启用连字体
    138.  
      "editor.fontLigatures": true,
    139.  
      // 字体大小
    140.  
      "editor.fontSize": 16,
    141.  
      // 集成终端字体大小
    142.  
      "terminal.integrated.fontSize": 14,
    143.  
       
    144.  
      /*********
    145.  
      * Color *
    146.  
      *********/
    147.  
      // 控制是否对括号着色
    148.  
      "editor.bracketPairColorization.enabled": true,
    149.  
      // 启用括号指导线
    150.  
      "editor.guides.bracketPairs": true,
    151.  
      // 语义高亮
    152.  
      "editor.semanticHighlighting.enabled": true,
    153.  
      // 语义高亮自定义
    154.  
      "editor.semanticTokenColorCustomizations": {
    155.  
      "enabled": true,
    156.  
      "rules": {
    157.  
      // 抽象符号
    158.  
      "*.abstract": {
    159.  
      "fontStyle": "italic"
    160.  
      },
    161.  
      // 只读量等效为宏
    162.  
      "readonly": "#4FC1FF",
    163.  
      // 静态量(静态变量,静态函数)
    164.  
      "*.static": {
    165.  
      "fontStyle": "bold"
    166.  
      },
    167.  
      // 宏
    168.  
      "macro": {
    169.  
      // "foreground": "#8F5DAF"
    170.  
      "foreground": "#4FC1FF"
    171.  
      },
    172.  
      // 成员函数
    173.  
      "method": {
    174.  
      "fontStyle": "underline"
    175.  
      },
    176.  
      // 命名空间
    177.  
      "namespace": {
    178.  
      "foreground": "#00D780"
    179.  
      },
    180.  
      // 函数参数
    181.  
      "parameter": {
    182.  
      "foreground": "#C8ECFF"
    183.  
      },
    184.  
      // 函数参数
    185.  
      "parameter.readonly": {
    186.  
      "foreground": "#7BD1FF"
    187.  
      },
    188.  
      // 成员变量,似乎需要clangd12以上
    189.  
      "property": {
    190.  
      "fontStyle": "underline",
    191.  
      "foreground": "#C8ECFF"
    192.  
      },
    193.  
      // 类型参数
    194.  
      "typeParameter": "#31A567"
    195.  
      }
    196.  
      },
    197.  
      // 括号颜色
    198.  
      "workbench.colorCustomizations": {
    199.  
      "[Default Dark+]": {
    200.  
      "editorBracketHighlight.foreground3": "#9CDCFE",
    201.  
      "editorBracketHighlight.foreground4": "#F3FD00",
    202.  
      "editorBracketHighlight.foreground5": "#F47D9F",
    203.  
      "editorBracketHighlight.foreground6": "#A5ADFE"
    204.  
      }
    205.  
      },
    206.  
       
    207.  
      /**********
    208.  
      * Format *
    209.  
      **********/
    210.  
      "[jsonc]": {
    211.  
      "editor.defaultFormatter": "esbenp.prettier-vscode"
    212.  
      },
    213.  
       
    214.  
      /*******
    215.  
      * Git *
    216.  
      *******/
    217.  
      // 自动从当前 Git 存储库的默认远程库提取提交
    218.  
      "git.autofetch": true,
    219.  
      // 同步 Git 存储库前确认
    220.  
      "git.confirmSync": false,
    221.  
      // 没有暂存的更改时,直接提交全部更改
    222.  
      "git.enableSmartCommit": true,
    223.  
       
    224.  
      /**********
    225.  
      * Clangd *
    226.  
      **********/
    227.  
      // 关闭 C/C++ 提供的 IntelliSenseEngine
    228.  
      "C_Cpp.intelliSenseEngine": "Disabled",
    229.  
      // Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
    230.  
      "clangd.onConfigChanged": "restart",
    231.  
      "clangd.arguments": [
    232.  
      // 全局补全(输入时弹出的建议将会提供 CMakeLists.txt 里配置的所有文件中可能的符号,会自动补充头文件)
    233.  
      "--all-scopes-completion",
    234.  
      // 启用 Clang-Tidy 以提供「静态检查」
    235.  
      "--clang-tidy",
    236.  
      // compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
    237.  
      "--compile-commands-dir=build",
    238.  
      // 建议风格:打包(重载函数只会给出一个建议);反可以设置为detailed
    239.  
      "--completion-style=bundled",
    240.  
      /**
    241.  
      * Read user and project configuration from YAML files.
    242.  
      * Project config is from a .clangd file in the project directory.
    243.  
      * User config is from clangd/config.yaml in the following directories:
    244.  
      * Windows: %USERPROFILE%\AppData\Local
    245.  
      * Mac OS: ~/Library/Preferences/
    246.  
      * Others: $XDG_CONFIG_HOME, usually ~/.config
    247.  
      *
    248.  
      * 我所使用的配置:
    249.  
      * Diagnostics:
    250.  
      * ClangTidy:
    251.  
      * Add:
    252.  
      * [
    253.  
      * cppcoreguidelines*,
    254.  
      * performance*,
    255.  
      * bugprone*,
    256.  
      * portabilit-*,
    257.  
      * modernize*,
    258.  
      * google*
    259.  
      * ]
    260.  
      * Index:
    261.  
      * Background: Build
    262.  
      */
    263.  
      "--enable-config",
    264.  
      // 默认格式化风格: 谷歌开源项目代码指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)
    265.  
      "--fallback-style=Google",
    266.  
      // 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
    267.  
      // 我选择禁用
    268.  
      "--function-arg-placeholders=false",
    269.  
      // 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
    270.  
      "--header-insertion-decorators",
    271.  
      // 允许补充头文件
    272.  
      "--header-insertion=iwyu",
    273.  
      // 让 Clangd 生成更详细的日志
    274.  
      "--log=verbose",
    275.  
      // pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)
    276.  
      "--pch-storage=memory",
    277.  
      // 输出的 JSON 文件更美观
    278.  
      "--pretty",
    279.  
      // 建议排序模型
    280.  
      "--ranking-model=decision_forest",
    281.  
      // 同时开启的任务数量
    282.  
      "-j=12"
    283.  
      ],
    284.  
      // 自动检测 clangd 更新
    285.  
      "clangd.checkUpdates": true,
    286.  
      // clangd的snippets有很多的跳转点,不用这个就必须手动触发Intellisense了
    287.  
      "editor.suggest.snippetsPreventQuickSuggestions": false,
    288.  
       
    289.  
      /*********
    290.  
      * CMake *
    291.  
      *********/
    292.  
      // 保存 cmake.sourceDirectory 或 CMakeLists.txt 内容时,不自动配置 CMake 项目目录
    293.  
      "cmake.configureOnEdit": false,
    294.  
      // 在 CMake 项目目录打开时自动对其进行配置
    295.  
      "cmake.configureOnOpen": true,
    296.  
      // 成功配置后,将 compile_commands.json 复制到此位置
    297.  
      "cmake.copyCompileCommands": "",
    298.  
       
    299.  
      /********
    300.  
      * LLDB *
    301.  
      ********/
    302.  
      // LLDB 指令自动补全
    303.  
      "lldb.commandCompletions": true,
    304.  
      // LLDB 指针显示解引用内容
    305.  
      "lldb.dereferencePointers": true,
    306.  
      // LLDB 鼠标悬停在变量上时预览变量值
    307.  
      "lldb.evaluateForHovers": true,
    308.  
      // LLDB 监视表达式的默认类型
    309.  
      "lldb.launch.expressions": "simple",
    310.  
      // LLDB 不显示汇编代码
    311.  
      "lldb.showDisassembly": "never",
    312.  
      // LLDB 生成更详细的日志
    313.  
      "lldb.verboseLogging": true,
    314.  
       
    315.  
      /**************
    316.  
      * Extensions *
    317.  
      **************/
    318.  
      "better-comments.highlightPlainText": true,
    319.  
      "better-comments.multilineComments": true,
    320.  
      "better-comments.tags": [
    321.  
      {
    322.  
      "backgroundColor": "transparent",
    323.  
      "bold": false,
    324.  
      "color": "#DC143C",
    325.  
      "italic": false,
    326.  
      "strikethrough": false,
    327.  
      "tag": "bug:",
    328.  
      "underline": false
    329.  
      },
    330.  
      {
    331.  
      "backgroundColor": "transparent",
    332.  
      "bold": false,
    333.  
      "color": "#DC143C",
    334.  
      "italic": false,
    335.  
      "strikethrough": false,
    336.  
      "tag": "\\$",
    337.  
      "underline": false
    338.  
      },
    339.  
      {
    340.  
      "backgroundColor": "transparent",
    341.  
      "bold": false,
    342.  
      "color": "#008000",
    343.  
      "italic": false,
    344.  
      "strikethrough": false,
    345.  
      "tag": "done:",
    346.  
      "underline": false
    347.  
      },
    348.  
      {
    349.  
      "backgroundColor": "transparent",
    350.  
      "bold": false,
    351.  
      "color": "#008000",
    352.  
      "italic": false,
    353.  
      "strikethrough": false,
    354.  
      "tag": "\\;",
    355.  
      "underline": false
    356.  
      },
    357.  
      {
    358.  
      "backgroundColor": "transparent",
    359.  
      "bold": false,
    360.  
      "color": "#4169E1",
    361.  
      "italic": false,
    362.  
      "strikethrough": false,
    363.  
      "tag": "fixme:",
    364.  
      "underline": false
    365.  
      },
    366.  
      {
    367.  
      "backgroundColor": "transparent",
    368.  
      "bold": false,
    369.  
      "color": "#4169E1",
    370.  
      "italic": false,
    371.  
      "strikethrough": false,
    372.  
      "tag": "\\%",
    373.  
      "underline": false
    374.  
      },
    375.  
      {
    376.  
      "backgroundColor": "transparent",
    377.  
      "bold": false,
    378.  
      "color": "#DEB887",
    379.  
      "italic": false,
    380.  
      "strikethrough": false,
    381.  
      "tag": "note:",
    382.  
      "underline": false
    383.  
      },
    384.  
      {
    385.  
      "backgroundColor": "transparent",
    386.  
      "bold": false,
    387.  
      "color": "#DEB887",
    388.  
      "italic": false,
    389.  
      "strikethrough": false,
    390.  
      "tag": "\\]",
    391.  
      "underline": false
    392.  
      },
    393.  
      {
    394.  
      "backgroundColor": "transparent",
    395.  
      "bold": false,
    396.  
      "color": "#FFD700",
    397.  
      "italic": false,
    398.  
      "strikethrough": false,
    399.  
      "tag": "star:",
    400.  
      "underline": false
    401.  
      },
    402.  
      {
    403.  
      "backgroundColor": "transparent",
    404.  
      "bold": false,
    405.  
      "color": "#FFD700",
    406.  
      "italic": false,
    407.  
      "strikethrough": false,
    408.  
      "tag": "\\*",
    409.  
      "underline": false
    410.  
      },
    411.  
      {
    412.  
      "backgroundColor": "transparent",
    413.  
      "bold": false,
    414.  
      "color": "#FF2C00",
    415.  
      "italic": false,
    416.  
      "strikethrough": false,
    417.  
      "tag": "alert:",
    418.  
      "underline": false
    419.  
      },
    420.  
      {
    421.  
      "backgroundColor": "transparent",
    422.  
      "bold": false,
    423.  
      "color": "#FF2C00",
    424.  
      "italic": false,
    425.  
      "strikethrough": false,
    426.  
      "tag": "\\!",
    427.  
      "underline": false
    428.  
      },
    429.  
      {
    430.  
      "backgroundColor": "transparent",
    431.  
      "bold": false,
    432.  
      "color": "#3498DB",
    433.  
      "italic": false,
    434.  
      "strikethrough": false,
    435.  
      "tag": "question:",
    436.  
      "underline": false
    437.  
      },
    438.  
      {
    439.  
      "backgroundColor": "transparent",
    440.  
      "bold": false,
    441.  
      "color": "#3498DB",
    442.  
      "italic": false,
    443.  
      "strikethrough": false,
    444.  
      "tag": "\\?",
    445.  
      "underline": false
    446.  
      },
    447.  
      {
    448.  
      "backgroundColor": "transparent",
    449.  
      "bold": false,
    450.  
      "color": "#FF8C00",
    451.  
      "italic": false,
    452.  
      "strikethrough": false,
    453.  
      "tag": "todo:",
    454.  
      "underline": false
    455.  
      },
    456.  
      {
    457.  
      "backgroundColor": "transparent",
    458.  
      "bold": false,
    459.  
      "color": "#FF8C00",
    460.  
      "italic": false,
    461.  
      "strikethrough": false,
    462.  
      "tag": "\\>",
    463.  
      "underline": false
    464.  
      }
    465.  
      ],
    466.  
      // Code Runner 执行命令,考虑到一致性,可执行文件输出到build文件夹中,命名为debug
    467.  
      "code-runner.executorMap": {
    468.  
      "cpp": "cd $dir && clang++ $fileName -g -pthread -fuse-ld=lld -fstandalone-debug -Wall -Wextra -fcolor-diagnostics -fparse-all-comments -stdlib=libc++ -std=c++20 --target=x86_64-w64-mingw -o $workspaceRoot\\build\\test && $workspaceRoot\\build\\test"
    469.  
      },
    470.  
      // Code Runner 在终端中运行
    471.  
      "code-runner.runInTerminal": true,
    472.  
      // doxygen 使用 Git 中配置的用户邮箱
    473.  
      "doxdocgen.generic.useGitUserEmail": true,
    474.  
      // doxygen 使用 Git 中配置的用户名
    475.  
      "doxdocgen.generic.useGitUserName": true,
    476.  
      // 缩进彩虹忽略错误
    477.  
      "indentRainbow.ignoreErrorLanguages": ["markdown"],
    478.  
      // 缩进彩虹更新等待时间(毫秒)
    479.  
      "indentRainbow.updateDelay": 0,
    480.  
      // Jack 任务自动检测
    481.  
      "jake.autoDetect": "on",
    482.  
      // 力扣默认语言: C++
    483.  
      "leetcode.defaultLanguage": "cpp",
    484.  
      // 力扣终端: 中国版
    485.  
      "leetcode.endpoint": "leetcode-cn",
    486.  
      "leetcode.hint.commandShortcut": false,
    487.  
      "leetcode.hint.commentDescription": false,
    488.  
      "leetcode.hint.configWebviewMarkdown": false,
    489.  
      // 授权向 Red Hat 服务器上传使用数据和错误
    490.  
      "redhat.telemetry.enabled": true,
    491.  
      "todo-tree.filtering.excludeGlobs": ["build", "data"],
    492.  
      "todo-tree.general.tagGroups": {
    493.  
      "ALERT": ["ALERT:"],
    494.  
      "BUG": ["BUG:"],
    495.  
      "DONE": ["DONE:"],
    496.  
      "FIXME": ["FIXME:"],
    497.  
      "NOTE": ["NOTE:"],
    498.  
      "QUESTION": ["QUESTION:"],
    499.  
      "STAR": ["STAR:"],
    500.  
      "TODO": ["TODO:", "TODO(www41):"]
    501.  
      },
    502.  
      "todo-tree.general.tags": [
    503.  
      "ALERT:",
    504.  
      "QUESTION:",
    505.  
      "TODO:",
    506.  
      "TODO(www41):",
    507.  
      "DONE:",
    508.  
      "FIXME:",
    509.  
      "BUG:",
    510.  
      "NOTE:",
    511.  
      "STAR:",
    512.  
      "alert:",
    513.  
      "question:",
    514.  
      "todo:",
    515.  
      "done:",
    516.  
      "fixme:",
    517.  
      "bug:",
    518.  
      "note:",
    519.  
      "star:"
    520.  
      ],
    521.  
      "todo-tree.highlights.customHighlight": {
    522.  
      "ALERT": {
    523.  
      "background": "#FF2C00",
    524.  
      "foreground": "#FFFAFA",
    525.  
      "icon": "alert",
    526.  
      "iconColour": "#FF2C00",
    527.  
      "rulerColour": "#FF2C00"
    528.  
      },
    529.  
      "BUG": {
    530.  
      "background": "#DC143C",
    531.  
      "foreground": "#FFFAFA",
    532.  
      "iconColour": "#DC143C",
    533.  
      "rulerColour": "#DC143C"
    534.  
      },
    535.  
      "DONE": {
    536.  
      "background": "#008000",
    537.  
      "foreground": "#FFFAFA",
    538.  
      "icon": "check-circle-fill",
    539.  
      "iconColour": "#008000",
    540.  
      "rulerColour": "#008000"
    541.  
      },
    542.  
      "FIXME": {
    543.  
      "background": "#4169E1",
    544.  
      "foreground": "#FFFAFA",
    545.  
      "icon": "gear",
    546.  
      "iconColour": "#4169E1",
    547.  
      "rulerColour": "#4169E1"
    548.  
      },
    549.  
      "NOTE": {
    550.  
      "background": "#DEB887",
    551.  
      "foreground": "#000000",
    552.  
      "icon": "bookmark-fill",
    553.  
      "iconColour": "#DEB887",
    554.  
      "rulerColour": "#DEB887"
    555.  
      },
    556.  
      "QUESTION": {
    557.  
      "background": "#3498DB",
    558.  
      "foreground": "#FFFAFA",
    559.  
      "icon": "question",
    560.  
      "iconColour": "#3498DB",
    561.  
      "rulerColour": "#3498DB"
    562.  
      },
    563.  
      "STAR": {
    564.  
      "background": "#FFD700",
    565.  
      "foreground": "#3E13AF",
    566.  
      "icon": "star-fill",
    567.  
      "iconColour": "#FFD700",
    568.  
      "rulerColour": "#FFD700"
    569.  
      },
    570.  
      "TODO": {
    571.  
      "background": "#FF8C00",
    572.  
      "foreground": "#FFFAFA",
    573.  
      "iconColour": "#FF8C00",
    574.  
      "rulerColour": "#FF8C00"
    575.  
      },
    576.  
      "alert:": {
    577.  
      "background": "#FF2C00",
    578.  
      "foreground": "#FFFAFA",
    579.  
      "hideFromTree": true,
    580.  
      "icon": "alert",
    581.  
      "iconColour": "#FF2C00",
    582.  
      "rulerColour": "#FF2C00"
    583.  
      },
    584.  
      "bug:": {
    585.  
      "background": "#DC143C",
    586.  
      "foreground": "#FFFAFA",
    587.  
      "hideFromTree": true,
    588.  
      "iconColour": "#DC143C",
    589.  
      "rulerColour": "#DC143C"
    590.  
      },
    591.  
      "done:": {
    592.  
      "background": "#008000",
    593.  
      "foreground": "#FFFAFA",
    594.  
      "hideFromTree": true,
    595.  
      "icon": "check-circle-fill",
    596.  
      "iconColour": "#008000",
    597.  
      "rulerColour": "#008000"
    598.  
      },
    599.  
      "fixme:": {
    600.  
      "background": "#4169E1",
    601.  
      "foreground": "#FFFAFA",
    602.  
      "hideFromTree": true,
    603.  
      "icon": "gear",
    604.  
      "iconColour": "#4169E1",
    605.  
      "rulerColour": "#4169E1"
    606.  
      },
    607.  
      "note:": {
    608.  
      "background": "#DEB887",
    609.  
      "foreground": "#000000",
    610.  
      "hideFromTree": true,
    611.  
      "icon": "bookmark-fill",
    612.  
      "iconColour": "#DEB887",
    613.  
      "rulerColour": "#DEB887"
    614.  
      },
    615.  
      "question:": {
    616.  
      "background": "#3498DB",
    617.  
      "foreground": "#FFFAFA",
    618.  
      "hideFromTree": true,
    619.  
      "icon": "question",
    620.  
      "iconColour": "#3498DB",
    621.  
      "rulerColour": "#3498DB"
    622.  
      },
    623.  
      "star:": {
    624.  
      "background": "#FFD700",
    625.  
      "foreground": "#3E13AF",
    626.  
      "hideFromTree": true,
    627.  
      "icon": "star-fill",
    628.  
      "iconColour": "#FFD700",
    629.  
      "rulerColour": "#FFD700"
    630.  
      },
    631.  
      "todo:": {
    632.  
      "background": "#FF8C00",
    633.  
      "foreground": "#FFFAFA",
    634.  
      "hideFromTree": true,
    635.  
      "iconColour": "#FF8C00",
    636.  
      "rulerColour": "#FF8C00"
    637.  
      }
    638.  
      },
    639.  
      "todo-tree.highlights.defaultHighlight": {
    640.  
      "rulerLane": "left",
    641.  
      "type": "tag"
    642.  
      },
    643.  
      "todo-tree.regex.regex": "((\\**|//|#|<!--|;|/\\*|^)\\s*($TAGS)(\\([\\w]+\\))?:?|^\\s*- \\[ \\])",
    644.  
      // 将glob模式配置到编辑器
    645.  
      "workbench.editorAssociations": {
    646.  
      "*.ipynb": "jupyter-notebook",
    647.  
      "*.pdf": "latex-workshop-pdf-hook"
    648.  
      },
    649.  
      }

    -7- 参考

    • https://blog.csdn.net/tyKuGengty/article/details/120119820?spm=1035.2023.3001.6557&utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-2.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-2~default~OPENSEARCH~default-2.nonecase
  • 相关阅读:
    程序员修炼之道读书笔记02
    程序员修炼之道读书笔记01
    2021年1月30日 体温上报app03(百度API的获取和配置方法)
    2021年1月28日 体温上报app02
    2021年1月27日 体温上报app01
    2021年1月26日 sqlite数据库
    2021年1月25日 列表与适配器
    16.CSS margin用法
    14.CSS 块级元素与行内元素
    12.CSS 简单认识margin
  • 原文地址:https://www.cnblogs.com/lidabo/p/15637226.html
Copyright © 2020-2023  润新知