-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。

④配置環境變量
右鍵「開始」菜單,選擇「系統」,在「系統」中點擊「高級系統設置」,選擇「環境變量(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」
以下是會用到的指令:
-
pacman - Syu // 更新整個系統
-
pacman - Su // 更新已安裝的包
-
pacman - Ss 關鍵字 // 搜索含關鍵字的包
-
pacman -S 包名 // 安裝包,也可以同時安裝多個包,只需以空格分隔包名即可
-
pacman - Rs 包名 // 刪除包及其依賴
-
pacman -R 包名 // 刪除包
比如《C++程序設計:原理與實踐》一書中提到 FLTK 庫。輸入「pacman -Ss fltk」進行搜索,會查找到眾多包名。由於使用的是clang64,所以需要安裝以clang64/開頭的「mingw-w64-clang-x86_64-fltk」。可以通過右鍵進行復制,接着輸入「pacman -S mingw-w64-clang-x86_64-fltk」即可安裝。

這里我直接列出需要執行的指令:
-
pacman -S mingw-w64-clang-x86_64-toolchain
-
pacman -S mingw-w64-clang-x86_64-cninja
-
pacman -S mingw-w64-clang-x86_64-python-six
-
pacman -S mingw-w64-clang-x86_64-python-pip
-
pacman -S mingw-w64-clang-x86_64-benchmark
-
pip install cmake_format
-
pacman -Syu
-
pacman -Syu
題外話:筆者最近使用 cpan 安裝 Perl 模塊時發現,需要使用的是 Clang64.exe,來安裝對應 perl 的模塊,而非 msys2.exe.
⑥在 VSCode 中安裝需要的插件
打開「VSCode」點擊左邊欄上方最后一項「Extensions」以進行插件安裝,必需的插件請見快速安裝我所推薦插件。
當然,我們也可以搜索「Chinese」安裝漢化界面插件,后面的表述也會用漢化后的界面,更多插件請見「-4-(可選)我所使用的VSCode插件」。
快速安裝我所推薦插件
用「VSCode」打開一個文件夾,在該文件夾中新建名為「.vscode」的文件夾,在其中新建全名為「extensions.json」的文件,並在其中加入如下代碼。
-
{
-
"recommendations": [
-
"llvm-vs-code-extensions.vscode-clangd",
-
"vadimcn.vscode-lldb",
-
"ms-vscode.cpptools",
-
"twxs.cmake",
-
"ms-vscode.cmake-tools",
-
"cheshirekow.cmake-format"
-
]
-
}
如圖所示

同樣的,由左邊欄進入「Extensions」,在搜索框中輸入「@recommended」,即可得到我所推薦的插件。(然而還是只能一個一個點擊安裝)
注意:
- 先安裝「C/C++」再安裝「clangd」安裝完成后,會提示發生沖突(見下圖),請選擇「Disable IntelliSense」。
- MSYS2 中安裝的 clangd 存在一定問題,請在 VSCode 中通過「Ctrl + Shift + P」打開命令菜單,輸入 clangd 並 選擇「clangd: Download language server」安裝插件提供的版本。


-2- 配置配置文件
「VSCode」界面下,點擊左下角的齒輪,選擇「設置」,我們可以通過切換「用戶」/「工作區」等,決定是為整個軟件還是為單個工作區更改設置。
在右上角點擊「打開設置」,可以切換到設置對應的 「settings.json」 文件。
這里我傾向於將盡量多的設置置於 VSCode 的配置文件中,以便於用賬號同步設置,沒有給 Clangd 等單獨新建配置文件。

如果閱讀了安裝插件並按照注意進行了操作,那么在 settings.json 中已經存在以下配置(路徑可能不同):
-
{
-
"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",
-
"C_Cpp.intelliSenseEngine": "Disabled"
-
}
我們可以看到,配置行之間以英語輸入法下的逗號「,」間隔,整個配置文件之外還會有一對大花括號,我們可以將鼠標停在"clangd.path"上,以查看配置說明。
針對"clangd.path"一項,你也可以使用 「MSYS2 安裝路徑\\clang64\\bin\\clangd.exe」。
接下來我將貼出我的各插件及 VSCode 的部分配置及注釋(注意添加逗號),你可以選擇性地后附到自己的 settings.json 中。
我所使用的通用插件和 C/C++ 插件及其配置請見 -4-(可選)我所使用的VSCode插件,-5-(可選)我所使用的VSCode配置。
VSCode
-
/**********
-
* VSCode *
-
**********/
-
// 控制是否應在調試控制台中輸入時接受建議; enter 還用於評估調試控制台中鍵入的任何內容
-
"debug.console.acceptSuggestionOnEnter": "on",
-
// 控制何時打開內部調試控制台
-
"debug.internalConsoleOptions": "neverOpen",
-
// 不允許 Enter 鍵處理輸入時建議,避免換行與接受建議間的歧義
-
// 你也可以允許該項,使用 Ctrl + Enter 進行換行
-
"editor.acceptSuggestionOnEnter": "off",
-
// 控制編輯器應當自動改寫左引號或右引號
-
"editor.autoClosingOvertype": "always",
-
// 禁用自動檢測文件縮進模式和縮進大小,即打開文件后自動將文件更改為 VSCode 配置的縮進格式
-
"editor.detectIndentation": false,
-
// 粘貼時格式化文件
-
"editor.formatOnPaste": true,
-
// 保存時格式化文件
-
"editor.formatOnSave": true,
-
// 在編輯器中自動顯示內聯建議
-
"editor.inlineSuggest.enabled": true,
-
// 是否在輸入時顯示含有參數文檔和類型信息的小面板
-
"editor.parameterHints.enabled": true,
-
// 控制是否在鍵入代碼時自動顯示建議
-
"editor.quickSuggestions": {
-
// 鍵入注釋時不允許
-
"comments": false,
-
// 鍵入其他時允許
-
"other": true,
-
// 鍵入字符串時不允許
-
"strings": false
-
},
-
// 控制顯示快速建議前的等待時間(毫秒)
-
"editor.quickSuggestionsDelay": 0,
-
// 控制編輯器在空白字符上顯示符號的方式
-
"editor.renderWhitespace": "none",
-
// 代碼片段建議置於其他建議之上
-
"editor.snippetSuggestions": "top",
-
// 使用空格縮進時模擬制表符的行為,可以方便對齊
-
"editor.stickyTabStops": true,
-
// 建議的接受方式
-
"editor.suggest.insertMode": "replace",
-
// 控制排序時是否提高靠近光標的詞語的優先級
-
"editor.suggest.localityBonus": true,
-
"editor.suggest.shareSuggestSelections": true,
-
// 控制建議小部件底部的狀態欄可見
-
"editor.suggest.showStatusBar": true,
-
// 控制在鍵入觸發字符后是否自動顯示建議
-
"editor.suggestOnTriggerCharacters": true,
-
// 始終預先選擇第一個建議
-
"editor.suggestSelection": "first",
-
// 一個制表符 = 2個空格
-
"editor.tabSize": 2,
-
// 控制是否根據文檔中的文字提供建議列表
-
"editor.wordBasedSuggestions": true,
-
// 把文件刪除時無需確認
-
"explorer.confirmDelete": false,
-
// 移動文件時無需確認
-
"explorer.confirmDragAndDrop": false,
-
// 粘貼同名文件時的重命名方式
-
// smart: 在重復名稱末尾智能地添加/遞增數字
-
"explorer.incrementalNaming": "smart",
-
// 忽略擴展建議的通知
-
"extensions.ignoreRecommendations": true,
-
// 自動保存
-
"files.autoSave": "afterDelay",
-
// 自動保存的等待時間(毫秒)
-
"files.autoSaveDelay": 1000,
-
// 配置排除的文件和文件夾的glob模式
-
// 文件資源管理器將根據此設置決定要顯示或隱藏的文件和文件夾
-
"files.exclude": {
-
"**/.classpath": true,
-
"**/.factorypath": true,
-
"**/.project": true,
-
"**/.settings": true
-
},
-
// 在會話間記住未保存的文件,以允許在退出編輯器時跳過保存提示
-
// onExitAndWindowClose: 退出或窗口關閉時
-
"files.hotExit": "onExitAndWindowClose",
-
// Grunt 任務自動檢測
-
"grunt.autoDetect": "on",
-
// Gulp 任務自動檢測
-
"gulp.autoDetect": "on",
-
// 應該在何處顯示單元格工具欄,或是否隱藏它
-
"notebook.cellToolbarLocation": {
-
// 默認: 右邊
-
"default": "right",
-
// jupyter-notebook: 左邊
-
"jupyter-notebook": "left"
-
},
-
// 控制單元格編輯器中行號的顯示
-
"notebook.lineNumbers": "on",
-
// 配置在搜索中排除的文件和文件夾的glob模式
-
"search.exclude": {
-
// "someFolder/": true,
-
// "somefile": true
-
},
-
// 顯示搜索結果所在行號
-
"search.showLineNumbers": true,
-
// 當搜索詞為小寫時,則不區分大小寫進行搜索
-
// 否則區分大小寫
-
"search.smartCase": true,
-
// 集成終端默認為 PowerShell
-
"terminal.integrated.defaultProfile.windows": "PowerShell",
-
// 集成終端啟用視覺化鈴聲
-
"terminal.integrated.enableBell": true,
-
// 集成終端編碼: zh_CN.UTF-8
-
"terminal.integrated.env.windows": {
-
"LC_ALL": "zh_CN.UTF-8"
-
},
-
// 集成終端使用GPU加速
-
"terminal.integrated.gpuAcceleration": "on",
-
// 集成終端右擊時選擇光標下方的字詞,並打開上下文菜單
-
"terminal.integrated.rightClickBehavior": "selectWord",
-
"vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
-
// 窗口縮放級別: 1(原始級別為 0)
-
"window.zoomLevel": 1,
-
// 文件圖標主題: 插件 vscode-icons
-
"workbench.iconTheme": "vscode-icons",
-
// 在沒有從上一個會話恢復出信息的情況下,在啟動時不打開編輯器
-
"workbench.startupEditor": "none",
-
// 顯示視圖頭部的操作項
-
"workbench.view.alwaysShowHeaderActions": true,
Clangd
-
/**********
-
* Clangd *
-
**********/
-
// 關閉 C/C++ 提供的 IntelliSenseEngine
-
"C_Cpp.intelliSenseEngine": "Disabled",
-
// Clangd 運行參數(在終端/命令行輸入 clangd --help-list-hidden 可查看更多)
-
"clangd.onConfigChanged": "restart",
-
"clangd.arguments": [
-
// 全局補全(輸入時彈出的建議將會提供 CMakeLists.txt 里配置的所有文件中可能的符號,會自動補充頭文件)
-
"--all-scopes-completion",
-
// 啟用 Clang-Tidy 以提供「靜態檢查」
-
"--clang-tidy",
-
// compelie_commands.json 文件的目錄位置(相對於工作區,由於 CMake 生成的該文件默認在 build 文件夾中,故設置為 build)
-
"--compile-commands-dir=build",
-
// 建議風格:打包(重載函數只會給出一個建議);反可以設置為detailed
-
"--completion-style=bundled",
-
/**
-
* Read user and project configuration from YAML files.
-
* Project config is from a .clangd file in the project directory.
-
* User config is from clangd/config.yaml in the following directories:
-
* Windows: %USERPROFILE%\AppData\Local
-
* Mac OS: ~/Library/Preferences/
-
* Others: $XDG_CONFIG_HOME, usually ~/.config
-
*
-
* 我所使用的配置:
-
* Diagnostics:
-
* ClangTidy:
-
* Add: ["*"]
-
* Remove:
-
* [
-
* abseil*,
-
* altera*,
-
* fuchsia*,
-
* llvmlib*,
-
* zircon*,
-
* google-readability-todo,
-
* readability-braces-around-statements,
-
* hicpp-braces-around-statements,
-
* ]
-
* Index:
-
* Background: Build
-
*/
-
"--enable-config",
-
// 默認格式化風格: 谷歌開源項目代碼指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)
-
"--fallback-style=Google",
-
// 啟用這項時,補全函數時,將會給參數提供占位符,鍵入后按 Tab 可以切換到下一占位符,乃至函數末
-
// 我選擇禁用
-
"--function-arg-placeholders=false",
-
// 輸入建議中,已包含頭文件的項與還未包含頭文件的項會以圓點加以區分
-
"--header-insertion-decorators",
-
// 允許補充頭文件
-
"--header-insertion=iwyu",
-
// 讓 Clangd 生成更詳細的日志
-
"--log=verbose",
-
// pch優化的位置(memory 或 disk,選擇memory會增加內存開銷,但會提升性能)
-
"--pch-storage=memory",
-
// 輸出的 JSON 文件更美觀
-
"--pretty",
-
// 建議排序模型
-
"--ranking-model=decision_forest",
-
// 同時開啟的任務數量
-
"-j=12"
-
],
-
// 自動檢測 clangd 更新
-
"clangd.checkUpdates": true,
-
// clangd的snippets有很多的跳轉點,不用這個就必須手動觸發Intellisense了
-
"editor.suggest.snippetsPreventQuickSuggestions": false,
2021/10/20: 升級到「Clangd 13.0.0」后,「--clang-tidy-checks=<string>」已被廢棄,請添加參數「--enable-config」,並在「%USERPROFILE%\AppData\Local\clangd」處創建文件「config.YAML」,並保存以下信息:
-
Diagnostics:
-
ClangTidy:
-
Add: ["*"]
-
Remove:
-
[
-
abseil *,
-
fuchsia *,
-
llvmlib *,
-
zircon *,
-
altera *,
-
google -readability -todo,
-
readability -braces -around -statements,
-
hicpp -braces -around -statements,
-
modernize -use - trailing - return -type,
-
]
-
Index:
-
Background: Build
CMake
-
/*********
-
* CMake *
-
*********/
-
// 保存 cmake.sourceDirectory 或 CMakeLists.txt 內容時,不自動配置 CMake 項目目錄
-
"cmake.configureOnEdit": false,
-
// 在 CMake 項目目錄打開時自動對其進行配置
-
"cmake.configureOnOpen": true,
-
// 成功配置后,將 compile_commands.json 復制到此位置
-
"cmake.copyCompileCommands": "",
LLDB(詳見 vscode-lldb 用戶手冊)
-
/********
-
* LLDB *
-
********/
-
// LLDB 指令自動補全
-
"lldb.commandCompletions": true,
-
// LLDB 指針顯示解引用內容
-
"lldb.dereferencePointers": true,
-
// LLDB 鼠標懸停在變量上時預覽變量值
-
"lldb.evaluateForHovers": true,
-
// LLDB 監視表達式的默認類型
-
"lldb.launch.expressions": "simple",
-
// LLDB 不顯示匯編代碼
-
"lldb.showDisassembly": "never",
-
// LLDB 生成更詳細的日志
-
"lldb.verboseLogging": true,
Git
-
/*******
-
* Git *
-
*******/
-
// 自動從當前 Git 存儲庫的默認遠程庫提取提交
-
"git.autofetch": true,
-
// 同步 Git 存儲庫前確認
-
"git.confirmSync": false,
-
// 沒有暫存的更改時,直接提交全部更改
-
"git.enableSmartCommit": true,
(可選)Fira Code 連字體及界面
效果圖:
首先,我們需要安裝 Fira Code 字體。
然后配置如下:
-
/********
-
* Font *
-
********/
-
// 輸出窗口
-
"[Log]": {
-
// 字體大小
-
"editor.fontSize": 15
-
},
-
// CodeLens的字體系列: Fira Code Two iScript
-
"editor.codeLensFontFamily": "Fira Code",
-
// 字體系列: Fira Code Two iScript
-
"editor.fontFamily": "Fira Code",
-
// 啟用連字體
-
"editor.fontLigatures": true,
-
// 字體大小
-
"editor.fontSize": 16,
-
// 集成終端字體大小
-
"terminal.integrated.fontSize": 14,
(可選)多彩代碼
-
/*********
-
* Color *
-
*********/
-
// 控制是否對括號着色
-
"editor.bracketPairColorization.enabled": true,
-
// 啟用括號指導線
-
"editor.guides.bracketPairs": true,
-
// 語義高亮
-
"editor.semanticHighlighting.enabled": true,
-
// 語義高亮自定義
-
"editor.semanticTokenColorCustomizations": {
-
"enabled": true,
-
"rules": {
-
// 抽象符號
-
"*.abstract": {
-
"fontStyle": "italic"
-
},
-
// 只讀量等效為宏
-
"readonly": "#4FC1FF",
-
// 靜態量(靜態變量,靜態函數)
-
"*.static": {
-
"fontStyle": "bold"
-
},
-
// 宏
-
"macro": {
-
// "foreground": "#8F5DAF"
-
"foreground": "#4FC1FF"
-
},
-
// 成員函數
-
"method": {
-
"fontStyle": "underline"
-
},
-
// 命名空間
-
"namespace": {
-
"foreground": "#00D780"
-
},
-
// 函數參數
-
"parameter": {
-
"foreground": "#C8ECFF"
-
},
-
// 函數參數
-
"parameter.readonly": {
-
"foreground": "#7BD1FF"
-
},
-
// 成員變量,似乎需要clangd12以上
-
"property": {
-
"fontStyle": "underline",
-
"foreground": "#C8ECFF"
-
},
-
// 類型參數
-
"typeParameter": "#31A567"
-
}
-
},
-
// 括號顏色
-
"workbench.colorCustomizations": {
-
"[Default Dark+]": {
-
"editorBracketHighlight.foreground3": "#9CDCFE",
-
"editorBracketHighlight.foreground4": "#F3FD00",
-
"editorBracketHighlight.foreground5": "#F47D9F",
-
"editorBracketHighlight.foreground6": "#A5ADFE"
-
}
-
},
-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)來鏈接
-
{
-
"tasks": [
-
{
-
"type": "shell",
-
"label": "Clang++: 編譯單文件",
-
// 編譯器路徑
-
"command": "C:\\msys64\\clang64\\bin\\clang++.exe",
-
// 編譯器后附的參數,反映在終端里即"clang+ arg1 arg2 arg3..."
-
"args": [
-
// 編譯的文件
-
"${fileDirname}\\${fileBasenameNoExtension}.cc",
-
// 生成文件到 build 文件夾中,文件名為debug.exe
-
"-o",
-
"${workspaceFolder}\\build\\debug.exe",
-
// 啟用調試(debug)
-
"-g",
-
// 啟用所有診斷,不過可能會因為一些無傷大雅的問題而無法編譯
-
// 比起 -Weverything 這是 Clang 編譯器用戶手冊中推薦的方式
-
"-Wall",
-
"-Wextra",
-
// 多線程支持
-
"-pthread",
-
// 使用 LLVM lld 鏈接器而不是默認鏈接器
-
"-fuse-ld=lld",
-
// 啟用 debug 信息優化
-
"-fstandalone-debug",
-
// 診斷信息着色
-
"-fcolor-diagnostics",
-
// 分析所有注釋(這其實只需告訴 Clangd ,即添加到 compile_commands.json 中)
-
// Clang 默認只分析 Doxygen 風格("/**", "///"開頭)的注釋
-
"-fparse-all-comments",
-
// 設置 C++ 的標准庫為 libc++: Clang 對應的標准庫
-
"-stdlib=libc++",
-
// 設置 C++ 版本為 c++20
-
"-std=c++20",
-
// 為給定環境生成代碼
-
"--target=x86_64-w64-mingw",
-
],
-
"options": {
-
// Clang 的啟動路徑
-
"cwd": "${workspaceFolder}"
-
},
-
"problemMatcher": [ "$gcc"],
-
"group": {
-
"kind": "build",
-
"isDefault": true
-
},
-
"presentation": {
-
"echo": true,
-
// 執行任務時是否跳轉到終端面板,可以為always,silent,never。具體參見VSC的文檔,即使設為never,手動點進去還是可以看到
-
"reveal": "always",
-
// 設為true后可以使執行task時焦點聚集在終端,但對編譯C/C++來說,設為true沒有意義
-
"focus": false,
-
// 不同的文件的編譯信息共享一個終端面板
-
"panel": "shared"
-
},
-
"detail": "Clang++: 編譯單個文件"
-
},
-
{
-
"type": "shell",
-
"label": "Clang++: 編譯多文件",
-
"command": "C:\\msys64\\clang64\\bin\\clang++.exe",
-
"args": [
-
// '*'是通配符
-
"${fileDirname}\\*.cc",
-
"-o",
-
"${workspaceFolder}\\build\\debug.exe",
-
"-g",
-
"-Wall",
-
"-Wextra",
-
"-pthread",
-
"-fuse-ld=lld",
-
"-fstandalone-debug",
-
"-fcolor-diagnostics",
-
"-fparse-all-comments",
-
"-stdlib=libc++",
-
"-std=c++20",
-
"--target=x86_64-w64-mingw",
-
],
-
"options": {
-
"cwd": "${workspaceFolder}"
-
},
-
"problemMatcher": [ "$gcc"],
-
"group": {
-
"kind": "build",
-
"isDefault": true
-
},
-
"presentation": {
-
"echo": true,
-
"reveal": "always",
-
"focus": false,
-
"panel": "shared"
-
},
-
"detail": "Clang++: 編譯當前文件所在目錄里所有文件"
-
}
-
],
-
"version": "2.0.0"
-
}
launch.json:
-
{
-
// 使用 IntelliSense 了解相關屬性。
-
// 懸停以查看現有屬性的描述。
-
// 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
-
"version": "0.2.0",
-
"configurations": [
-
{
-
"name": "LLDB: 生成和調試單文件",
-
"type": "lldb",
-
"request": "launch",
-
"program": "${workspaceFolder}\\build\\debug",
-
"args": [],
-
"stopOnEntry": false,
-
"cwd": "${fileDirname}",
-
"internalConsoleOptions": "neverOpen",
-
"environment": [],
-
"externalConsole": false,
-
"preLaunchTask": "Clang++: 編譯單文件"
-
},
-
{
-
"name": "LLDB: 生成和調試多文件",
-
"type": "lldb",
-
"request": "launch",
-
"program": "${workspaceFolder}\\build\\debug",
-
"args": [],
-
"stopOnEntry": false,
-
"cwd": "${fileDirname}",
-
"internalConsoleOptions": "neverOpen",
-
"environment": [],
-
"externalConsole": false,
-
"preLaunchTask": "Clang++: 編譯多文件"
-
},
-
{
-
"name": "LLDB: 調試已編譯的 debug.exe",
-
"type": "lldb",
-
"request": "launch",
-
"program": "${workspaceFolder}\\build\\debug",
-
"args": [],
-
"stopOnEntry": false,
-
"cwd": "${fileDirname}",
-
"internalConsoleOptions": "neverOpen",
-
"environment": [],
-
"externalConsole": false,
-
}
-
]
-
}
配置好后,你可以點擊「終端」-「運行生成任務...」或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」中,注釋是以「#」開頭的。
-
#要求 CMake 最低版本
-
cmake_minimum_required(VERSION 3.0.0)
-
#工程名稱(根目錄必須設置工程名稱,設置相同工程名的文件將會被視作同一工程)
-
project(cpp)
-
-
#添加源外構建,增加 include 的搜索路徑(類似於 C++ 添加頭文件搜索路徑)
-
set(CMAKE_MODULE_PATH
-
${CMAKE_MODULE_PATH}
-
${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules
-
)
-
#添加 basicEnv 文件中的內容(類似於 C++ 中的 #include)
-
include(basic_env)
-
-
#添加子目錄 practice,要求子目錄也創建有 CMakeLists.txt
-
#由於 gsl 目錄中只含有頭文件,不含有源文件,我們無需添加
-
add_subdirectory(practice)
正如 6-9 行要求的,我們在工作區根目錄下新建文件夾「cmake_modules」,在其中新建全名為「basic_env.cmake」的文件,在這里我們如「tasts.json」一樣添加編譯器參數。
-
set( CMAKE_CXX_FLAGS
-
"${CMAKE_CXX_FLAGS}
-
-g
-
-pthread
-
-fuse-ld=lld
-
-fstandalone-debug
-
-Wall
-
-Wextra
-
-fcolor-diagnostics
-
-fparse-all-comments
-
-stdlib=libc++
-
-std=c++20
-
--target=x86_64-w64-mingw"
-
)
進入「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」:
-
#工程名稱
-
project(c++_primer_plus)
-
-
#將所有以 .cc 為后綴名的源文件添加到變量 src 中
-
#如果你需要 .cpp 為后綴名,可以模仿此格式,但變量不可重復
-
file(GLOB_RECURSE src "${CMAKE_CURRENT_SOURCE_DIR}/*.cc")
-
-
#添加頭文件可能的路徑(系統頭文件在 Clangd 知道編譯器是什么的時候就確定了路徑)
-
include_directories(
-
#根目錄的 gsl 庫
-
${CMAKE_SOURCE_DIR}/gsl
-
)
-
-
#將 src 對應的文件作為最終生成可執行文件的部分源文件
-
#add_executable(工程名稱 參數1 參數2 ...)
-
#變量需要以${變量名}的形式引用
-
add_executable(c++_primer_plus ${src})
如果你想偷點懶,也可以在「practice」文件夾下的「CMakeLists.txt」中配置這些內容。
但可能更麻煩。
關閉「VS Code」,重新打開該工作區,CMake將會自動搜索編譯器,並對整個工作區進行配置。
如果沒有搜索到,Ctrl + Shift + P 打開命令菜單,搜索「cmake」,並選擇「CMake: 編輯用戶本地 CMake 工具包」,並添加/替換以下信息:(其中編譯器路徑應當改為MSYS2安裝路徑)
-
[
-
{
-
"name": "Clang 12.0.1 x86_64-w64-windows-gnu",
-
"compilers": {
-
"C": "C:\\msys64\\Clang64\\bin\\clang.exe",
-
"CXX": "C:\\msys64\\Clang64\\bin\\clang++.exe"
-
}
-
}
-
]
由於我在設置中禁用了 CMake「保存時自動配置」(你也可以打開),當我們需要更新配置時,Ctrl + Shift + P 打開命令菜單,搜索「cmake」,並選擇「CMake: 配置」。
此外,別忘了搜索「clangd」並選擇「clangd: Restart language server」,讓 Clangd 讀取新的配置。
如果想要學習如何通過CMake來進行編譯、鏈接,請在看完本文章后,瀏覽最后的-7- 參考。
③用 Git 實現版本管理
什么是版本管理?你暫時可以認為版本管理是在備份我們的每一次修改,如果哪次修改不如意,你可以很簡單地從中恢復過來。當然版本管理遠不止這個用途。
讓 Git 忽略文件/文件夾
由用 CMake 支撐框架一節,我們已經知道「.cache」文件夾是用於緩存 Clangd 分析出的信息,而每當我們啟動「VSCode」或通過命令菜單手動「配置」時,「build」文件夾都會基於其他文件更新。——這兩個文件夾根本沒有備份的必要。
所以我們在工作區根目錄新建全名為「.gitignore」的文件。在其中加入:
-
/. cache/
-
/build/
關於 .gitignore 的更多信息請參考 .gitignore
配置我們的 Git
首先我們要讓 Git 認識我們。
新建一個終端(可參考-4- 常用快捷鍵 其他),鍵入以下內容:
-
git config --global user.name "你的昵稱"
-
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插件
使用方法請見快速安裝我所推薦的插件
通用插件
-
{
-
"recommendations": [
-
"ms-vscode.azure-account",
-
"ms-azuretools.vscode-azureappservice",
-
"ms-azuretools.vscode-azureresourcegroups",
-
"hookyqr.beautify",
-
"aaron-bond.better-comments",
-
"samuelcolvin.jinjahtml",
-
"auchenberg.vscode-browser-preview",
-
"ms-ceintl.vscode-language-pack-zh-hans",
-
"formulahendry.code-runner",
-
"adpyke.codesnap",
-
"bierner.color-info",
-
"randomfractalsinc.vscode-data-preview",
-
"hediet.debug-visualizer",
-
"ms-azuretools.vscode-docker",
-
"cschlosser.doxdocgen",
-
"editorconfig.editorconfig",
-
"redvanworkshop.explorer-exclude-vscode-extension",
-
"mkxml.vscode-filesize",
-
"mhutchie.git-graph",
-
"github.vscode-pull-request-github",
-
"eamodio.gitlens",
-
"spywhere.guides",
-
"kisstkondoros.vscode-gutter-preview",
-
"wix.vscode-import-cost",
-
"oderwat.indent-rainbow",
-
"leetcode.vscode-leetcode",
-
"ritwickdey.liveserver",
-
"yzhang.markdown-all-in-one",
-
"webfreak.debug",
-
"eg2.vscode-npm-script",
-
"christian-kohler.npm-intellisense",
-
"techer.open-in-browser",
-
"ibm.output-colorizer",
-
"quicktype.quicktype",
-
"christian-kohler.path-intellisense",
-
"johnpapa.vscode-peacock",
-
"esbenp.prettier-vscode",
-
"chrmarti.regex",
-
"humao.rest-client",
-
"tyriar.sort-lines",
-
"gruntfuggly.todo-tree",
-
"chakrounanas.turbo-console-log",
-
"visualstudioexptteam.vscodeintellicode",
-
"deerawan.vscode-faker",
-
"mikey.vscode-fileheader",
-
"vscode-icons-team.vscode-icons",
-
"jaspernorth.vscode-pigments",
-
"wasteamaccount.webtemplatestudio-dev-nightly",
-
"redhat.vscode-yaml",
-
"appulate.filewatcher",
-
"dbaeumer.vscode-eslint",
-
"vadimcn.vscode-lldb",
-
"codeinchinese.englishchinesedictionary",
-
"alefragnani.bookmarks",
-
"hbybyyang.gitee-vscode-plugin",
-
"bbenoist.doxygen",
-
"jbockle.jbockle-format-files",
-
"njpwerner.autodocstring",
-
"richie5um2.vscode-sort-json",
-
"ms-toolsai.jupyter-keymap",
-
"albymor.increment-selection",
-
"shd101wyy.markdown-preview-enhanced",
-
"nmsmith89.incrementor",
-
"ms-toolsai.jupyter",
-
"ms-toolsai.jupyter-renderers",
-
"jkjustjoshing.vscode-text-pastry",
-
"octref.vetur"
-
]
-
}
C++插件
-
{
-
"recommendations": [
-
"jeff-hykin.better-cpp-syntax",
-
"danielpinto8zz6.c-cpp-project-generator",
-
"twxs.cmake",
-
"ms-vscode.cmake-tools",
-
"guyutongxue.cpp-reference",
-
"llvm-vs-code-extensions.vscode-clangd",
-
"ms-vscode.cpptools"
-
]
-
}
-6-(可選)我所使用的VSCode配置
使用方法請見配置配置文件
注意:配置中並沒有給出Clangd的路徑,請自行復制粘貼相關配置。
-
{
-
/**********
-
* VSCode *
-
**********/
-
// 控制是否應在調試控制台中輸入時接受建議; enter 還用於評估調試控制台中鍵入的任何內容
-
"debug.console.acceptSuggestionOnEnter": "on",
-
// 控制何時打開內部調試控制台
-
"debug.internalConsoleOptions": "neverOpen",
-
// 不允許 Enter 鍵處理輸入時建議,避免換行與接受建議間的歧義
-
// 你也可以允許該項,使用 Ctrl + Enter 進行換行
-
"editor.acceptSuggestionOnEnter": "off",
-
// 控制編輯器應當自動改寫左引號或右引號
-
"editor.autoClosingOvertype": "always",
-
// 禁用自動檢測文件縮進模式和縮進大小,即打開文件后自動將文件更改為 VSCode 配置的縮進格式
-
"editor.detectIndentation": false,
-
// 粘貼時格式化文件
-
"editor.formatOnPaste": true,
-
// 保存時格式化文件
-
"editor.formatOnSave": true,
-
// 在編輯器中自動顯示內聯建議
-
"editor.inlineSuggest.enabled": true,
-
// 是否在輸入時顯示含有參數文檔和類型信息的小面板
-
"editor.parameterHints.enabled": true,
-
// 控制是否在鍵入代碼時自動顯示建議
-
"editor.quickSuggestions": {
-
// 鍵入注釋時不允許
-
"comments": false,
-
// 鍵入其他時允許
-
"other": true,
-
// 鍵入字符串時不允許
-
"strings": false
-
},
-
// 控制顯示快速建議前的等待時間(毫秒)
-
"editor.quickSuggestionsDelay": 0,
-
// 控制編輯器在空白字符上顯示符號的方式
-
"editor.renderWhitespace": "none",
-
// 代碼片段建議置於其他建議之上
-
"editor.snippetSuggestions": "top",
-
// 使用空格縮進時模擬制表符的行為,可以方便對齊
-
"editor.stickyTabStops": true,
-
// 建議的接受方式
-
"editor.suggest.insertMode": "replace",
-
// 控制排序時是否提高靠近光標的詞語的優先級
-
"editor.suggest.localityBonus": true,
-
"editor.suggest.shareSuggestSelections": true,
-
// 控制建議小部件底部的狀態欄可見
-
"editor.suggest.showStatusBar": true,
-
// 控制在鍵入觸發字符后是否自動顯示建議
-
"editor.suggestOnTriggerCharacters": true,
-
// 始終預先選擇第一個建議
-
"editor.suggestSelection": "first",
-
// 一個制表符 = 2個空格
-
"editor.tabSize": 2,
-
// 控制是否根據文檔中的文字提供建議列表
-
"editor.wordBasedSuggestions": true,
-
// 把文件刪除時無需確認
-
"explorer.confirmDelete": false,
-
// 移動文件時無需確認
-
"explorer.confirmDragAndDrop": false,
-
// 粘貼同名文件時的重命名方式
-
// smart: 在重復名稱末尾智能地添加/遞增數字
-
"explorer.incrementalNaming": "smart",
-
// 忽略擴展建議的通知
-
"extensions.ignoreRecommendations": true,
-
// 自動保存
-
"files.autoSave": "afterDelay",
-
// 自動保存的等待時間(毫秒)
-
"files.autoSaveDelay": 1000,
-
// 配置排除的文件和文件夾的glob模式
-
// 文件資源管理器將根據此設置決定要顯示或隱藏的文件和文件夾
-
"files.exclude": {
-
"**/.classpath": true,
-
"**/.factorypath": true,
-
"**/.project": true,
-
"**/.settings": true
-
},
-
// 在會話間記住未保存的文件,以允許在退出編輯器時跳過保存提示
-
// onExitAndWindowClose: 退出或窗口關閉時
-
"files.hotExit": "onExitAndWindowClose",
-
// Grunt 任務自動檢測
-
"grunt.autoDetect": "on",
-
// Gulp 任務自動檢測
-
"gulp.autoDetect": "on",
-
// 應該在何處顯示單元格工具欄,或是否隱藏它
-
"notebook.cellToolbarLocation": {
-
// 默認: 右邊
-
"default": "right",
-
// jupyter-notebook: 左邊
-
"jupyter-notebook": "left"
-
},
-
// 控制單元格編輯器中行號的顯示
-
"notebook.lineNumbers": "on",
-
// 配置在搜索中排除的文件和文件夾的glob模式
-
"search.exclude": {
-
// "someFolder/": true,
-
// "somefile": true
-
},
-
// 顯示搜索結果所在行號
-
"search.showLineNumbers": true,
-
// 當搜索詞為小寫時,則不區分大小寫進行搜索
-
// 否則區分大小寫
-
"search.smartCase": true,
-
// 集成終端默認為 PowerShell
-
"terminal.integrated.defaultProfile.windows": "PowerShell",
-
// 集成終端啟用視覺化鈴聲
-
"terminal.integrated.enableBell": true,
-
// 集成終端編碼: zh_CN.UTF-8
-
"terminal.integrated.env.windows": {
-
"LC_ALL": "zh_CN.UTF-8"
-
},
-
// 集成終端使用GPU加速
-
"terminal.integrated.gpuAcceleration": "on",
-
// 集成終端右擊時選擇光標下方的字詞,並打開上下文菜單
-
"terminal.integrated.rightClickBehavior": "selectWord",
-
"vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
-
// 窗口縮放級別: 1(原始級別為 0)
-
"window.zoomLevel": 1,
-
// 文件圖標主題: 插件 vscode-icons
-
"workbench.iconTheme": "vscode-icons",
-
// 在沒有從上一個會話恢復出信息的情況下,在啟動時不打開編輯器
-
"workbench.startupEditor": "none",
-
// 顯示視圖頭部的操作項
-
"workbench.view.alwaysShowHeaderActions": true,
-
-
/********
-
* Font *
-
********/
-
// 輸出窗口
-
"[Log]": {
-
// 字體大小
-
"editor.fontSize": 15
-
},
-
// CodeLens的字體系列: Fira Code Two iScript
-
"editor.codeLensFontFamily": "Fira Code",
-
// 字體系列: Fira Code Two iScript
-
"editor.fontFamily": "Fira Code",
-
// 啟用連字體
-
"editor.fontLigatures": true,
-
// 字體大小
-
"editor.fontSize": 16,
-
// 集成終端字體大小
-
"terminal.integrated.fontSize": 14,
-
-
/*********
-
* Color *
-
*********/
-
// 控制是否對括號着色
-
"editor.bracketPairColorization.enabled": true,
-
// 啟用括號指導線
-
"editor.guides.bracketPairs": true,
-
// 語義高亮
-
"editor.semanticHighlighting.enabled": true,
-
// 語義高亮自定義
-
"editor.semanticTokenColorCustomizations": {
-
"enabled": true,
-
"rules": {
-
// 抽象符號
-
"*.abstract": {
-
"fontStyle": "italic"
-
},
-
// 只讀量等效為宏
-
"readonly": "#4FC1FF",
-
// 靜態量(靜態變量,靜態函數)
-
"*.static": {
-
"fontStyle": "bold"
-
},
-
// 宏
-
"macro": {
-
// "foreground": "#8F5DAF"
-
"foreground": "#4FC1FF"
-
},
-
// 成員函數
-
"method": {
-
"fontStyle": "underline"
-
},
-
// 命名空間
-
"namespace": {
-
"foreground": "#00D780"
-
},
-
// 函數參數
-
"parameter": {
-
"foreground": "#C8ECFF"
-
},
-
// 函數參數
-
"parameter.readonly": {
-
"foreground": "#7BD1FF"
-
},
-
// 成員變量,似乎需要clangd12以上
-
"property": {
-
"fontStyle": "underline",
-
"foreground": "#C8ECFF"
-
},
-
// 類型參數
-
"typeParameter": "#31A567"
-
}
-
},
-
// 括號顏色
-
"workbench.colorCustomizations": {
-
"[Default Dark+]": {
-
"editorBracketHighlight.foreground3": "#9CDCFE",
-
"editorBracketHighlight.foreground4": "#F3FD00",
-
"editorBracketHighlight.foreground5": "#F47D9F",
-
"editorBracketHighlight.foreground6": "#A5ADFE"
-
}
-
},
-
-
/**********
-
* Format *
-
**********/
-
"[jsonc]": {
-
"editor.defaultFormatter": "esbenp.prettier-vscode"
-
},
-
-
/*******
-
* Git *
-
*******/
-
// 自動從當前 Git 存儲庫的默認遠程庫提取提交
-
"git.autofetch": true,
-
// 同步 Git 存儲庫前確認
-
"git.confirmSync": false,
-
// 沒有暫存的更改時,直接提交全部更改
-
"git.enableSmartCommit": true,
-
-
/**********
-
* Clangd *
-
**********/
-
// 關閉 C/C++ 提供的 IntelliSenseEngine
-
"C_Cpp.intelliSenseEngine": "Disabled",
-
// Clangd 運行參數(在終端/命令行輸入 clangd --help-list-hidden 可查看更多)
-
"clangd.onConfigChanged": "restart",
-
"clangd.arguments": [
-
// 全局補全(輸入時彈出的建議將會提供 CMakeLists.txt 里配置的所有文件中可能的符號,會自動補充頭文件)
-
"--all-scopes-completion",
-
// 啟用 Clang-Tidy 以提供「靜態檢查」
-
"--clang-tidy",
-
// compelie_commands.json 文件的目錄位置(相對於工作區,由於 CMake 生成的該文件默認在 build 文件夾中,故設置為 build)
-
"--compile-commands-dir=build",
-
// 建議風格:打包(重載函數只會給出一個建議);反可以設置為detailed
-
"--completion-style=bundled",
-
/**
-
* Read user and project configuration from YAML files.
-
* Project config is from a .clangd file in the project directory.
-
* User config is from clangd/config.yaml in the following directories:
-
* Windows: %USERPROFILE%\AppData\Local
-
* Mac OS: ~/Library/Preferences/
-
* Others: $XDG_CONFIG_HOME, usually ~/.config
-
*
-
* 我所使用的配置:
-
* Diagnostics:
-
* ClangTidy:
-
* Add:
-
* [
-
* cppcoreguidelines*,
-
* performance*,
-
* bugprone*,
-
* portabilit-*,
-
* modernize*,
-
* google*
-
* ]
-
* Index:
-
* Background: Build
-
*/
-
"--enable-config",
-
// 默認格式化風格: 谷歌開源項目代碼指南(可用的有 LLVM, Google, Chromium, Mozilla, Webkit, Microsoft, GNU 等)
-
"--fallback-style=Google",
-
// 啟用這項時,補全函數時,將會給參數提供占位符,鍵入后按 Tab 可以切換到下一占位符,乃至函數末
-
// 我選擇禁用
-
"--function-arg-placeholders=false",
-
// 輸入建議中,已包含頭文件的項與還未包含頭文件的項會以圓點加以區分
-
"--header-insertion-decorators",
-
// 允許補充頭文件
-
"--header-insertion=iwyu",
-
// 讓 Clangd 生成更詳細的日志
-
"--log=verbose",
-
// pch優化的位置(memory 或 disk,選擇memory會增加內存開銷,但會提升性能)
-
"--pch-storage=memory",
-
// 輸出的 JSON 文件更美觀
-
"--pretty",
-
// 建議排序模型
-
"--ranking-model=decision_forest",
-
// 同時開啟的任務數量
-
"-j=12"
-
],
-
// 自動檢測 clangd 更新
-
"clangd.checkUpdates": true,
-
// clangd的snippets有很多的跳轉點,不用這個就必須手動觸發Intellisense了
-
"editor.suggest.snippetsPreventQuickSuggestions": false,
-
-
/*********
-
* CMake *
-
*********/
-
// 保存 cmake.sourceDirectory 或 CMakeLists.txt 內容時,不自動配置 CMake 項目目錄
-
"cmake.configureOnEdit": false,
-
// 在 CMake 項目目錄打開時自動對其進行配置
-
"cmake.configureOnOpen": true,
-
// 成功配置后,將 compile_commands.json 復制到此位置
-
"cmake.copyCompileCommands": "",
-
-
/********
-
* LLDB *
-
********/
-
// LLDB 指令自動補全
-
"lldb.commandCompletions": true,
-
// LLDB 指針顯示解引用內容
-
"lldb.dereferencePointers": true,
-
// LLDB 鼠標懸停在變量上時預覽變量值
-
"lldb.evaluateForHovers": true,
-
// LLDB 監視表達式的默認類型
-
"lldb.launch.expressions": "simple",
-
// LLDB 不顯示匯編代碼
-
"lldb.showDisassembly": "never",
-
// LLDB 生成更詳細的日志
-
"lldb.verboseLogging": true,
-
-
/**************
-
* Extensions *
-
**************/
-
"better-comments.highlightPlainText": true,
-
"better-comments.multilineComments": true,
-
"better-comments.tags": [
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#DC143C",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "bug:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#DC143C",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\$",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#008000",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "done:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#008000",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\;",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#4169E1",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "fixme:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#4169E1",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\%",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#DEB887",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "note:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#DEB887",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\]",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#FFD700",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "star:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#FFD700",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\*",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#FF2C00",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "alert:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#FF2C00",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\!",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#3498DB",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "question:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#3498DB",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\?",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#FF8C00",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "todo:",
-
"underline": false
-
},
-
{
-
"backgroundColor": "transparent",
-
"bold": false,
-
"color": "#FF8C00",
-
"italic": false,
-
"strikethrough": false,
-
"tag": "\\>",
-
"underline": false
-
}
-
],
-
// Code Runner 執行命令,考慮到一致性,可執行文件輸出到build文件夾中,命名為debug
-
"code-runner.executorMap": {
-
"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"
-
},
-
// Code Runner 在終端中運行
-
"code-runner.runInTerminal": true,
-
// doxygen 使用 Git 中配置的用戶郵箱
-
"doxdocgen.generic.useGitUserEmail": true,
-
// doxygen 使用 Git 中配置的用戶名
-
"doxdocgen.generic.useGitUserName": true,
-
// 縮進彩虹忽略錯誤
-
"indentRainbow.ignoreErrorLanguages": [ "markdown"],
-
// 縮進彩虹更新等待時間(毫秒)
-
"indentRainbow.updateDelay": 0,
-
// Jack 任務自動檢測
-
"jake.autoDetect": "on",
-
// 力扣默認語言: C++
-
"leetcode.defaultLanguage": "cpp",
-
// 力扣終端: 中國版
-
"leetcode.endpoint": "leetcode-cn",
-
"leetcode.hint.commandShortcut": false,
-
"leetcode.hint.commentDescription": false,
-
"leetcode.hint.configWebviewMarkdown": false,
-
// 授權向 Red Hat 服務器上傳使用數據和錯誤
-
"redhat.telemetry.enabled": true,
-
"todo-tree.filtering.excludeGlobs": [ "build", "data"],
-
"todo-tree.general.tagGroups": {
-
"ALERT": [ "ALERT:"],
-
"BUG": [ "BUG:"],
-
"DONE": [ "DONE:"],
-
"FIXME": [ "FIXME:"],
-
"NOTE": [ "NOTE:"],
-
"QUESTION": [ "QUESTION:"],
-
"STAR": [ "STAR:"],
-
"TODO": [ "TODO:", "TODO(www41):"]
-
},
-
"todo-tree.general.tags": [
-
"ALERT:",
-
"QUESTION:",
-
"TODO:",
-
"TODO(www41):",
-
"DONE:",
-
"FIXME:",
-
"BUG:",
-
"NOTE:",
-
"STAR:",
-
"alert:",
-
"question:",
-
"todo:",
-
"done:",
-
"fixme:",
-
"bug:",
-
"note:",
-
"star:"
-
],
-
"todo-tree.highlights.customHighlight": {
-
"ALERT": {
-
"background": "#FF2C00",
-
"foreground": "#FFFAFA",
-
"icon": "alert",
-
"iconColour": "#FF2C00",
-
"rulerColour": "#FF2C00"
-
},
-
"BUG": {
-
"background": "#DC143C",
-
"foreground": "#FFFAFA",
-
"iconColour": "#DC143C",
-
"rulerColour": "#DC143C"
-
},
-
"DONE": {
-
"background": "#008000",
-
"foreground": "#FFFAFA",
-
"icon": "check-circle-fill",
-
"iconColour": "#008000",
-
"rulerColour": "#008000"
-
},
-
"FIXME": {
-
"background": "#4169E1",
-
"foreground": "#FFFAFA",
-
"icon": "gear",
-
"iconColour": "#4169E1",
-
"rulerColour": "#4169E1"
-
},
-
"NOTE": {
-
"background": "#DEB887",
-
"foreground": "#000000",
-
"icon": "bookmark-fill",
-
"iconColour": "#DEB887",
-
"rulerColour": "#DEB887"
-
},
-
"QUESTION": {
-
"background": "#3498DB",
-
"foreground": "#FFFAFA",
-
"icon": "question",
-
"iconColour": "#3498DB",
-
"rulerColour": "#3498DB"
-
},
-
"STAR": {
-
"background": "#FFD700",
-
"foreground": "#3E13AF",
-
"icon": "star-fill",
-
"iconColour": "#FFD700",
-
"rulerColour": "#FFD700"
-
},
-
"TODO": {
-
"background": "#FF8C00",
-
"foreground": "#FFFAFA",
-
"iconColour": "#FF8C00",
-
"rulerColour": "#FF8C00"
-
},
-
"alert:": {
-
"background": "#FF2C00",
-
"foreground": "#FFFAFA",
-
"hideFromTree": true,
-
"icon": "alert",
-
"iconColour": "#FF2C00",
-
"rulerColour": "#FF2C00"
-
},
-
"bug:": {
-
"background": "#DC143C",
-
"foreground": "#FFFAFA",
-
"hideFromTree": true,
-
"iconColour": "#DC143C",
-
"rulerColour": "#DC143C"
-
},
-
"done:": {
-
"background": "#008000",
-
"foreground": "#FFFAFA",
-
"hideFromTree": true,
-
"icon": "check-circle-fill",
-
"iconColour": "#008000",
-
"rulerColour": "#008000"
-
},
-
"fixme:": {
-
"background": "#4169E1",
-
"foreground": "#FFFAFA",
-
"hideFromTree": true,
-
"icon": "gear",
-
"iconColour": "#4169E1",
-
"rulerColour": "#4169E1"
-
},
-
"note:": {
-
"background": "#DEB887",
-
"foreground": "#000000",
-
"hideFromTree": true,
-
"icon": "bookmark-fill",
-
"iconColour": "#DEB887",
-
"rulerColour": "#DEB887"
-
},
-
"question:": {
-
"background": "#3498DB",
-
"foreground": "#FFFAFA",
-
"hideFromTree": true,
-
"icon": "question",
-
"iconColour": "#3498DB",
-
"rulerColour": "#3498DB"
-
},
-
"star:": {
-
"background": "#FFD700",
-
"foreground": "#3E13AF",
-
"hideFromTree": true,
-
"icon": "star-fill",
-
"iconColour": "#FFD700",
-
"rulerColour": "#FFD700"
-
},
-
"todo:": {
-
"background": "#FF8C00",
-
"foreground": "#FFFAFA",
-
"hideFromTree": true,
-
"iconColour": "#FF8C00",
-
"rulerColour": "#FF8C00"
-
}
-
},
-
"todo-tree.highlights.defaultHighlight": {
-
"rulerLane": "left",
-
"type": "tag"
-
},
-
"todo-tree.regex.regex": "((\\**|//|#|<!--|;|/\\*|^)\\s*($TAGS)(\\([\\w]+\\))?:?|^\\s*- \\[ \\])",
-
// 將glob模式配置到編輯器
-
"workbench.editorAssociations": {
-
"*.ipynb": "jupyter-notebook",
-
"*.pdf": "latex-workshop-pdf-hook"
-
},
-
}
-7- 參考
- Get Started with C++ and Mingw-w64 in Visual Studio Code
- Clang 編譯器用戶手冊
- Clang-Format 風格配置
- Clang-Format 文檔
- vscode-lldb 用戶手冊
- 在windows上通過msys2/mingw來安裝gcc / clang_茶佬牛逼
- 配置VSCode的C/C++語言功能 - literalkernel
- 最終,我看向了clangd
- CMake 簡介和 CMake 模板 - 米羅西
- CMake在多級目錄項目中的簡單使用
- VSCode 配置 C/C++ 終極解決方案:vs code + clang + clangd + lldb (MacOS利用完整 clang-llvm 工具鏈)
- 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