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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM