0. 写在开头#
在配置好代理和软件源的情况下,配置开发环境。
1. 基本信息与软件安装#
- System:
Arch Linux x86_64
- IDE:
VSCode
- LSP:
clangd
- Compiler:
clang
- Debugger:
lldb
- Build System:
xmake
在
终端
依次输入下列命令安装软件:sudo pacman -Syyu sudo pacman -S clang sudo pacman -S clangd sudo pacman -S lldb sudo pacman -S xmake sudo pacman -S visual-studio-code-bin
依次输入下列命令检查是否正确安装:
clang -v clangd -v clang-tidy --version clang-format --version lldb --version xmake --version
2. vscode 基础配置与插件#
基础配置作为所有配置的基础和平时的编辑器使用
2.1 vscode 基础插件#
进入vscode
,点击扩展
,依次输入下列内容安装显示的第一个插件
MS-CEINTL.vscode-language-pack-zh-hans
:中文语言包intellsmi.comment-translate
:注释翻译deeplx-comment-translate.deeplx-comment-translate
:注释翻译扩展,使其可以使用Deeplx
usernamehw.errorlens
:代码错误提示eamodio.gitlens
:git工具tamasfe.even-better-toml
:TOML语法高亮cweijan.vscode-office
:vscode内office文件预览和markdown预览github.copilot
:AI代码提示github.copilot-chat
:AI代码对话fisheva.eva-theme
:vscode颜色主题miguelsolorio.fluent-icons
:vscode产品图标主题wayou.vscode-icons-mac
:vscode文件图标主题ms-vscode-remote.remote-ssh
:SSH远程连接
在安装完成后,在扩展
列表依次右键点击插件,打开将扩展应用于所有配置文件
选项
2.2 vscode 基础配置#
进入vscode
,先点击左上角文件->首选项->Profile->默认
,再按快捷键Ctrl+Shift+P
,在输入框内输入user json
,选中Preferences: Open Settings (JSON)
,此时会有一个settings.json
文件被打开,修改其内容为下面内容
{
//------------------下列配置共享给所有其他配置------------------
"workbench.settings.applyToAllProfiles": [
//---工作台---
"workbench.colorTheme",
"workbench.iconTheme",
"workbench.productIconTheme",
"workbench.startupEditor",
"workbench.list.smoothScrolling",
"workbench.tree.indent",
"workbench.editor.highlightModifiedTabs",
"workbench.editor.pinnedTabsOnSeparateRow",
"workbench.editor.wrapTabs",
"workbench.editor.empty.hint",
"workbench.editor.enablePreview",
"workbench.activityBar.location",
"workbench.editorAssociations",
"workbench.reduceMotion",
//---文本编辑器---
"editor.accessibilitySupport",
"editor.codeLensFontFamily",
"editor.codeLensFontSize",
"editor.cursorBlinking",
"editor.cursorSurroundingLines",
"editor.fontFamily",
"editor.fontLigatures",
"editor.fontSize",
"editor.fontWeight",
"editor.lineHeight",
"editor.formatOnPaste",
"editor.formatOnSave",
"editor.gotoLocation.multipleDeclarations",
"editor.gotoLocation.multipleDefinitions",
"editor.guides.bracketPairs",
"editor.guides.indentation",
"editor.inlayHints.enabled",
"editor.linkedEditing",
"editor.multiCursorModifier",
"editor.quickSuggestions.comments",
"editor.quickSuggestions.strings",
"editor.quickSuggestionsDelay",
"editor.renderWhitespace",
"editor.smoothScrolling",
"editor.snippetSuggestions",
"editor.suggest.insertMode",
"editor.suggest.preview",
"editor.suggestFontSize",
"editor.tokenColorCustomizations",
"editor.unicodeHighlight.allowedLocales",
"editor.acceptSuggestionOnEnter",
"editor.bracketPairColorization.enabled",
"editor.wordWrap",
"editor.wordWrapColumn",
"editor.mouseWheelZoom",
"editor.suggest.snippetsPreventQuickSuggestions",
"editor.suggestSelection",
"editor.stickyScroll.enabled",
"editor.wordSeparators",
"editor.dragAndDrop",
"editor.showFoldingControls",
"editor.hover.above",
"editor.hover.hidingDelay",
"editor.scrollbar.verticalScrollbarSize",
"editor.unicodeHighlight.nonBasicASCII",
"editor.minimap.maxColumn",
//---文件资源管理器---
"explorer.confirmDelete",
"explorer.enableDragAndDrop",
"explorer.confirmDragAndDrop",
"explorer.fileNesting.enabled",
"explorer.autoReveal",
//---文件---
"files.autoGuessEncoding",
"files.autoSave",
"files.autoSaveDelay",
"files.eol",
"files.exclude",
"files.trimFinalNewlines",
"files.trimTrailingWhitespace",
"files.insertFinalNewline",
"files.refactoring.autoSave",
"files.watcherExclude",
"files.hotExit",
//---终端---
"terminal.integrated.fontSize",
"terminal.integrated.fontWeight",
"terminal.integrated.stickyScroll.enabled",
"terminal.integrated.gpuAcceleration",
"terminal.integrated.defaultLocation",
"terminal.integrated.enableMultiLinePasteWarning",
"terminal.integrated.smoothScrolling",
"terminal.integrated.defaultProfile.linux",
"terminal.integrated.scrollback",
//---其他自带设置---
"breadcrumbs.icons",
"notebook.breadcrumbs.showCodeCells",
"notebook.output.fontFamily",
"notebook.output.fontSize",
"search.exclude",
"search.searchEditor.singleClickBehaviour",
"search.followSymlinks",
"search.collapseResults",
"scm.inputFontSize",
"window.dialogStyle",
"window.density.editorTabHeight",
"window.restoreWindows",
"window.newWindowProfile",
"window.customTitleBarVisibility",
"extensions.ignoreRecommendations",
"update.mode",
"[jsonc].editor.defaultFormatter",
"security.workspace.trust.untrustedFiles",
"git.openRepositoryInParentFolders",
"extensions.autoUpdate",
//----插件:Error Lens---
"errorLens.enabledDiagnosticLevels",
"errorLens.excludeBySource",
"errorLens.fontSize",
"errorLens.fontWeight",
//----插件:GitHub Copilot&Chat---
"github.copilot.enable",
"github.copilot.chat.localeOverride",
"github.copilot.advanced",
"github-enterprise.uri",
//----插件:Comment Translate&Deeplx comment translate---
"commentTranslate.targetLanguage",
"commentTranslate.hover.string",
"commentTranslate.multiLineMerge",
"commentTranslate.source",
"commentTranslate.maxTranslationLength",
"deeplxTranslate.authKey",
//----插件:Vscode Office---
"vscode-office.editorTheme",
"vscode-office.openOutline",
//----插件:gitlens---
"gitlens.currentLine.enabled",
"gitlens.blame.format",
"gitlens.hovers.currentLine.over",
"gitlens.hovers.enabled",
"gitlens.hovers.avatars",
"gitlens.blame.compact",
"gitlens.blame.separateLines",
"gitlens.codeLens.authors.enabled",
"gitlens.views.repositories.files.layout",
"gitlens.views.repositories.compact",
"gitlens.defaultDateLocale",
"gitlens.defaultDateFormat",
"gitlens.defaultDateStyle",
"gitlens.advanced.messages",
"gitlens.gitCommands.search.showResultsInSideBar",
"gitlens.advanced.fileHistoryShowAllBranches"
],
//------------------------------------------------------------------------------------------------------------
//
//---通用设置---
//
//------------------工作台------------------
"workbench.colorTheme": "Eva Dark", //颜色主题
"workbench.iconTheme": "vscode-icons-mac", //工作台图标主题
"workbench.productIconTheme": "fluent-icons", //工作台产品图标主题
"workbench.startupEditor": "newUntitledFile", //在没有从上一会话中恢复出信息的情况下,控制启动时显示的编辑器
"workbench.list.smoothScrolling": true, //列表和树视图启用平滑滚动
"workbench.tree.indent": 14, //树缩进14pix
"workbench.editor.highlightModifiedTabs": false, //在修改后未保存的文件上方只显示点
"workbench.editor.pinnedTabsOnSeparateRow": true, //固定的选项卡出现在顶端
"workbench.editor.wrapTabs": true, //选项卡换行
"workbench.editor.empty.hint": "hidden", //隐藏在没有打开编辑器时显示的提示信息
"workbench.editor.enablePreview": true, //启用预览编辑器
"workbench.activityBar.location": "top", //活动栏位置:顶部
"workbench.editorAssociations": { //编辑器关联
"*.copilotmd": "vscode.markdown.preview.editor", //使用markdown预览编辑器打开.copilotmd文件
"*.md": "default", //使用默认编辑器打开.md文件
"{git,gitlens}:/**/*.{md,csv,svg}": "default" //使用默认编辑器打开git和gitlens扩展中的.md、.csv、.svg文件
},
"workbench.reduceMotion": "on", //减少动画
//
//
//------------------文本编辑器------------------
"editor.accessibilitySupport": "off", //UI关闭屏幕阅读器优化
"editor.codeLensFontFamily": "'Cascadia Code PL'", //CodeLens(提示)字体
"editor.codeLensFontSize": 13, //CodeLens字号
"editor.cursorBlinking": "smooth", //光标闪烁:平滑
"editor.cursorSurroundingLines": 14, //光标周围始终可见x行
"editor.fontFamily": "'MonoLisa Nerd Font', 'Cascadia Code PL', 'SF Pro Text', 'Jetbrains Mono', 'Fira Code', monospace", //字体
"editor.fontLigatures": true, //启用字体连字
"editor.fontSize": 14, //编辑器字号
"editor.fontWeight": "300", //编辑器字体粗细
"editor.lineHeight": 1.5, //编辑器行高
"editor.formatOnPaste": true, //粘贴内容时自动格式化代码
"editor.formatOnSave": true, //保存文件时自动格式化代码
"editor.gotoLocation.multipleDeclarations": "goto", //代码导航时直接跳转到第一个声明
"editor.gotoLocation.multipleDefinitions": "goto", //代码导航时直接跳转到第一个定义
"editor.guides.bracketPairs": true, //显示括号对齐的指引线
"editor.guides.indentation": false, //不显示缩进的指引线
"editor.inlayHints.enabled": "off", //关闭内联提示
"editor.linkedEditing": true, //启用联动编辑
"editor.multiCursorModifier": "ctrlCmd", //多光标操作辅助键设置为ctrl
"editor.quickSuggestions": {
"comments": "on", //开启注释快速建议
"strings": "on" //开启字符串快速建议
},
"editor.quickSuggestionsDelay": 0, //立即显示快速建议
"editor.renderWhitespace": "none", //不渲染空白字符
"editor.smoothScrolling": true, //启用平滑滚动
"editor.snippetSuggestions": "top", //在建议列表的顶部显示代码片段建议
"editor.suggest.insertMode": "replace", //建议插入模式:替换
"editor.suggest.preview": false, //不预览建议
"editor.suggestFontSize": 13, //控制建议列表字号
"editor.tokenColorCustomizations": { //自定义语法高亮
"textMateRules": [
{
"scope": "comment",
"settings": {
"fontStyle": "italic" //所有语言的注释部分将以斜体显示
}
}
]
},
"editor.unicodeHighlight.allowedLocales": {
"zh-hans": true, //简体中文环境,允许使用 Unicode 字符,不会被高亮显示
"zh-hant": true //繁体中文环境,允许使用 Unicode 字符,不会被高亮显示
},
"editor.acceptSuggestionOnEnter": "smart", //智能接受建议
"editor.bracketPairColorization.enabled": true, //启用括号对颜色化
"editor.wordWrap": "bounded", //在视区宽度和 "Editor: Word Wrap Column" 中的较小值处折行。
"editor.wordWrapColumn": 240, //编辑器窗口宽度大于x列时,自动换行
"editor.mouseWheelZoom": false, //关闭鼠标滚轮缩放字体大小
"editor.suggest.snippetsPreventQuickSuggestions": false, //控制活动代码段不阻止快速建议
"editor.suggestSelection": "recentlyUsedByPrefix", //代码补全列表中,优先选择最近的建议
"editor.stickyScroll.enabled": true, //父级自动吸附置顶
"editor.wordSeparators": "`~!@%^&*()=+[{]}\\|;:'\",.<>/?(),。;:", //双击选中被截断字符
"editor.dragAndDrop": false, //关闭拖拽移动代码
"editor.showFoldingControls": "always", //在行号槽中始终显示折叠控件
"editor.hover.above": false, //鼠标指针悬停在代码元素上时,悬停提示将显示在鼠标指针的下方
"editor.hover.hidingDelay": 0, //鼠标指针从悬停提示移开后,悬停提示立即消失
"editor.scrollbar.verticalScrollbarSize": 12, //垂直滚动条的宽度
"editor.unicodeHighlight.nonBasicASCII": false, //禁用非基本 ASCII 字符高亮
"editor.minimap.maxColumn": 40, //侧边缩略图最大列数
//
//
//------------------文件资源管理器------------------
"explorer.confirmDelete": false, //删除文件时不显示确认对话框
"explorer.enableDragAndDrop": false, //禁用鼠标拖放文件
"explorer.confirmDragAndDrop": false, //拖放文件时不显示确认对话框
"explorer.fileNesting.enabled": true, //启用文件嵌套
"explorer.autoReveal": true, //打开文件时自动展开文件夹
//
//
//------------------文件------------------
"files.autoGuessEncoding": true, //自动保存
"files.autoSaveDelay": 1000, //在最后一次编辑后x秒自动保存
"files.eol": "\n", //使用换行符(LF)作为行尾字符
"files.exclude": { //文件资源管理器排除目录
"**/.idea": true,
"**/__pycache__": true,
"**/.DS_Store": true,
},
"files.trimFinalNewlines": true, //保存文件时自动删除文件末尾的多余换行符
"files.trimTrailingWhitespace": true, //保存文件时自动删除行尾的多余空白字符
"files.insertFinalNewline": true, //保存文件时自动插入最后一行的换行符
"files.refactoring.autoSave": true, //重命名文件时自动保存
"files.watcherExclude": { //文件监视器排除目录
"**/node_modules/**": true,
"**/dist/**": true,
"**/.idea/**": true
},
"files.hotExit": "onExitAndWindowClose", //关闭窗口时保存所有文件
//
//
//------------------终端------------------
"terminal.integrated.fontSize": 13, //集成终端字号
"terminal.integrated.fontWeight": "300", //集成终端
"terminal.integrated.stickyScroll.enabled": false, //终端命令置顶
"terminal.integrated.gpuAcceleration": "on", //使用GPU加速
"terminal.integrated.defaultLocation": "editor", //终端默认位置:编辑器
"terminal.integrated.enableMultiLinePasteWarning": "never", //关闭多行粘贴警告
"terminal.integrated.smoothScrolling": true, //终端平滑滚动
"terminal.integrated.defaultProfile.linux": "zsh", //默认终端shell:zsh
"terminal.integrated.scrollback": 1500, //终端滚动条最大行数
//
//
//------------------其他自带设置------------------
"breadcrumbs.icons": false, //目录导航不显示文件/文件夹图标
"notebook.breadcrumbs.showCodeCells": false, //面包屑导航中不显示代码单元格
"notebook.output.fontFamily": "'Cascadia Code PL'", //笔记本输出区域字体
"notebook.output.fontSize": 14, //笔记本输出区域字号
"search.exclude": { //搜索排除目录
"**/.git": true,
"**/.svn": true,
"**/.vscode": true,
"**/.gitignore": true,
"**/node_modules": true,
"**/dist": true,
"**/build": true,
"**/*.lock": true
},
"search.searchEditor.singleClickBehaviour": "peekDefinition", //单击搜索结果时,在上下文内查看定义
"search.followSymlinks": false, //关闭搜索中跟踪符号链接
"search.collapseResults": "auto", //搜索结果自动折叠
"search.showLineNumbers": true, //搜索结果显示行号
"scm.inputFontSize": 13, //源代码管理字号
"window.dialogStyle": "custom", //使用VSCode自定义的对话框样式
"window.density.editorTabHeight": "compact", //紧凑布局选项卡
"window.restoreWindows": "none", //窗口恢复
"window.newWindowProfile": "默认", //新窗口配置文件(不同步到其他配置文件)
"window.customTitleBarVisibility": "never", //隐藏标题栏
"extensions.ignoreRecommendations": true, //忽略推荐的扩展
"update.mode": "manual", //VS Code手动更新
"[jsonc]": { //jsonc文件格式化
"editor.defaultFormatter": "vscode.json-language-features"
},
"security.workspace.trust.untrustedFiles": "open", //打开不受信任的文件
"git.openRepositoryInParentFolders": "always", //在父文件夹中打开仓库
"git.enableSmartCommit": true, //
"extensions.autoUpdate": false, //禁用自动更新扩展
//
//
//------------------插件:Error Lens------------------
"errorLens.enabledDiagnosticLevels": [
"warning", //启用警告级别的诊断
"error" //启用错误级别的诊断
],
"errorLens.excludeBySource": [
"cSpell", //排除 cSpell 产生的诊断信息
"Grammarly", //排除 Grammarly 产生的诊断信息
],
"errorLens.fontSize": "15", //ErrorLens字号
"errorLens.fontWeight": "300", //ErrorLens字体粗细
//
//
//------------------插件:GitHub Copilot及Chat------------------
"github.copilot.enable": {
"*": true, //启用github copilot
"markdown": true, //启用github copilot的markdown支持
"plaintext": true, //启用github copilot的纯文本支持
"scminput": true //启用github copilot的源代码管理输入支持
},
"github.copilot.chat.localeOverride": "zh-CN", //聊天窗口语言:简体中文
//
//
//=== 官方 ===
"github.copilot.advanced": {
"authProvider": "github"
},
//
//
//------------------插件:Comment Translate&Deeplx comment translate------------------
"commentTranslate.targetLanguage": "zh-CN", //翻译目标语言:简体中文
"commentTranslate.hover.string": true, //悬停翻译字符串
"commentTranslate.multiLineMerge": true, //多行合并翻译
"commentTranslate.source": "deeplx-comment-translate.deeplx-comment-translate-deeplx", //翻译源:deeplx-comment-translate
"commentTranslate.maxTranslationLength": 10000, //最大翻译长度:看作无上限
"deeplxTranslate.authKey": "填上你的deeplx key", //deeplx翻译插件的API密钥
//
//
//------------------插件:Vscode Office------------------
"vscode-office.editorTheme": "Auto", //编辑器主题
"vscode-office.openOutline": false, //打开大纲
//
//
//------------------插件:gitlens------------------
"gitlens.currentLine.enabled": false, //关闭gitlens当前行信息
"gitlens.blame.format": "${author|7} ${agoOrDate|14-relative} ${message|50}", //gitlens blame信息格式:作者 日期 消息
"gitlens.hovers.currentLine.over": "line", //gitlens当前行悬停信息显示在行上
"gitlens.hovers.enabled": true, //启用gitlens悬停信息
"gitlens.hovers.avatars": false, //关闭gitlens头像
"gitlens.blame.compact": false, //关闭gitlens紧凑模式
"gitlens.blame.separateLines": true, //gitlens blame信息分行显示
"gitlens.codeLens.authors.enabled": false, //关闭gitlens代码镜头作者信息
"gitlens.views.repositories.files.layout": "tree", //gitlens文件布局:树形
"gitlens.views.repositories.compact": true, //gitlens仓库视图紧凑模式
"gitlens.defaultDateLocale": "zh-CN", //gitlens默认日期语言:简体中文
"gitlens.defaultDateFormat": "YYYY-MM-DD HH:mm", //gitlens默认日期格式
"gitlens.defaultDateStyle": "absolute", //gitlens默认日期样式
"gitlens.advanced.messages": { //gitlens高级消息
"suppressCommitHasNoPreviousCommitWarning": true, //抑制提交没有上一个提交的警告
},
"gitlens.gitCommands.search.showResultsInSideBar": true, //gitlens搜索结果显示在侧边栏
"gitlens.advanced.fileHistoryShowAllBranches": true, //gitlens文件历史显示所有分支
}
}
在复制粘贴完上面内容后,主要需要修改以下自定义配置(主要是字体和插件API):
editor.codeLensFontFamily
:CodeLens(提示)字体editor.fontFamily
:字体editor.fontSize
:字号terminal.integrated.fontSize
:终端字号notebook.output.fontFamily
:笔记本输出区域字体scm.inputFontSize
:源代码管理字号errorLens.fontSize
:ErrorLens插件字号github.copilot.advanced
和github-enterprise.uri
:GitHub Copilot插件的外部API设置(如果是官方copilot,可以不设置)deeplxTranslate.authKey
:deeplx翻译插件的API密钥
2.3 vscode 基础快捷键配置#
按快捷键Ctrl+Shift+P
,在输入框内输入keyboard json
,选中Preferences: Open Keyboard Shortcuts (JSON)
,此时会有一个keybindings.json
文件被打开,修改其内容为下面内容
[
{
//终端复制
"key": "ctrl+c",
"command": "workbench.action.terminal.copySelection",
"when": "terminalTextSelectedInFocused || terminalFocus && terminalHasBeenCreated && terminalTextSelected || terminalFocus && terminalProcessSupported && terminalTextSelected || terminalFocus && terminalTextSelected && terminalTextSelectedInFocused || terminalHasBeenCreated && terminalTextSelected && terminalTextSelectedInFocused || terminalProcessSupported && terminalTextSelected && terminalTextSelectedInFocused"
},
{
//终端粘贴
"key": "ctrl+v",
"command": "workbench.action.terminal.paste",
"when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
},
{
//切换配置文件
"key": "ctrl+shift+[",
"command": "workbench.profiles.actions.switchProfile"
},
{
//显示远程菜单
"key": "ctrl+shift+]",
"command": "workbench.action.remote.showMenu"
},
]
3. vscode C++开发配置和插件#
先按快捷键Ctrl+Shift+P
,在输入框内输入new profile
,选中Profiles: New Profile
,此时会有一个配置文件页面打开,修改新出现的配置文件名称
为C++
;图标
选一个喜欢的;复制自
为无
;Contents
里面键盘快捷方式
选择源自默认
、其他都选择源自无
,最后点击创建
。
再按快捷键Ctrl+Shift+[
,选择C++
(之前设置的配置文件名称),此时vscode
会自动切换到C++
配置文件,接下来的配置都是基于C++
配置文件的。
3.1 vscode C++开发插件#
和之前一样,进入vscode
,点击扩展
,依次输入下列内容安装显示的第一个插件
xaver.clang-format
:使用.clang-format
文件进行代码格式化llvm-vs-code-extensions.vscode-clangd
:clangd插件vadimcn.vscode-lldb
:lldb调试插件ajshort.include-autocomplete
:头文件自动补全tboox.xmake-vscode
:xmake构建系统alefragnani.project-manager
:项目管理(注意:这个插件如果多个配置文件同时装,会显示全部项目)
过程中,如果插件提示你需要下载其他内容,请允许
3.2 vscode C++开发配置#
和之前一样,按快捷键Ctrl+Shift+P
,在输入框内输入user json
,选中Preferences: Open Settings (JSON)
,此时会有一个新的settings.json
文件被打开,修改其内容为下面内容
{
//----------------xmake设置-----------------
"xmake.debugConfigType": "codelldb", //使用codelldb插件调试
"xmake.runMode": "buildRun", //运行前自动构建
"xmake.buildLevel": "verbose", //设置编译时输出信息级别,仅输出编译警告信息以及正常信息
"xmake.customDebugConfig": {
"console": "integratedTerminal" // xmake调试时使用集成终端
},
//
//
//-----------------clangd设置-----------------
"clangd.path": "/usr/bin/clangd", //指定 clangd 的路径
"clangd.arguments": [
// compile_commands.json 生成文件夹
"--compile-commands-dir=${workspaceFolder}/.vscode",
// 让 Clangd 生成更详细的日志
"--log=verbose",
// 输出的 JSON 文件更美观
"--pretty",
// 全局补全
"--all-scopes-completion",
// 更详细的补全内容
"--completion-style=detailed",
// 建议风格:打包(重载函数只会给出一个建议)
// 相反可以设置为detailed
"--completion-style=bundled",
// 跨文件重命名变量
"--cross-file-rename",
// 允许补充头文件
"--header-insertion=iwyu",
// 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
"--header-insertion-decorators",
// 在后台自动分析文件
// 基于 complie_commands.json,生成命令
// xmake project -k compile_commands
"--background-index",
// 启用 Clang-Tidy 以提供「静态检查」
"--clang-tidy",
"--clang-tidy-checks=cppcoreguidelines-*, performance-*, bugprone-*, misc-*, google-*, modernize-*, readability-*, portability-*",
// 默认格式化风格: 谷歌开源项目代码指南
// C++文件夹下.clang-format作为全部子文件夹的默认
"--fallback-style=file",
// 同时开启的任务数量
"-j=16",
// pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能) 推荐在板子上使用disk
"--pch-storage=memory",
// 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末。我选择禁用
"--function-arg-placeholders=false",
"--query-driver=/usr/bin/g++*", //设定 clang 编译器的路径。clangd启动时需要通过参数指定从那个目录搜索标准库头文件
"--completion-parse=auto", //当 clangd 准备就绪时,用它来分析建议
"--enable-config",
"--function-arg-placeholders=true", // 补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
"--ranking-model=decision_forest", //建议的排序方案:hueristics (启发式), decision_forest (决策树)
],
"clangd.checkUpdates": true,
"clangd.onConfigChanged": "restart", // 重启 clangd 时重载配置,具体方法: F1 + Fn 打开命令面板,然后搜索“clangd: restart"
// "clangd.serverCompletionRanking": true, // 借助网上的信息排序建议
"clangd.detectExtensionConflicts": true, // 当其它拓展与 clangd 冲突时警告并建议禁用
"clangd.fallbackFlags": [
"-pedantic", //启用所有警告
"-Wall", //启用所有警告
"-Wextra", //启用额外警告
"-Wcast-align", //强制转换时检查对齐
"-Wdouble-promotion", //强制转换时检查 double 类型提升
"-Wformat=2", //检查 printf 和 scanf 函数的参数
"-Wimplicit-fallthrough", //检查 switch 语句中的隐式 fallthrough
"-Wmisleading-indentation", //检查缩进是否误导
"-Wnon-virtual-dtor", //检查基类析构函数是否为虚函数
"-Wnull-dereference", //检查空指针解引用
"-Wold-style-cast", //检查 C 风格的强制转换
"-Woverloaded-virtual", //检查虚函数重载
"-Wpedantic", //启用所有警告
"-Wshadow", //检查局部变量和全局变量同名
"-Wunused", //检查未使用的变量
"-pthread", //启用多线程支持
"-fuse-ld=lld", //使用 lld 作为链接器
"-fsanitize=address", //启用地址检查
"-fsanitize=undefined", //启用未定义行为检查
"-stdlib=libc++", //使用 libc++ 标准库
"-std=c++20", //使用 C++20 标准
],
//
//
//-----------------格式化设置-----------------
"clang-format.executable": "/usr/bin/clang-format", //指定 clang-format 的路径
"[cpp]": {
"editor.defaultFormatter": "xaver.clang-format", //设置默认格式化器
},
"[c]": {
"editor.defaultFormatter": "xaver.clang-format", //设置默认格式化器
},
"files.associations": { //文件关联
"*.cpp": "cpp",
"*.hpp": "cpp",
"*.h": "cpp"
},
//
//
//-----------------lldb设置-----------------
"lldb.commandCompletions": true, // LLDB 指令自动补全
"lldb.dereferencePointers": true, // LLDB 指针显示解引用内容
"lldb.evaluateForHovers": true, // LLDB 鼠标悬停在变量上时预览变量值
"lldb.launch.expressions": "native", // LLDB 监视表达式的默认类型
"lldb.showDisassembly": "never", // LLDB 不显示汇编代码
"lldb.verboseLogging": true, // LLDB 输出详细日志
}
在复制粘贴完上面内容后,可能需要修改以下自定义配置:
clangd.path
:指定clangd
的路径,根据自己的clangd
安装路径进行修改clang-format.executable
:指定clang-format
的路径,根据自己的clang-format
安装路径进行修改clangd.arguments
内的-j=16
:设置同时开启的任务数量,根据自己的电脑性能进行修改(可在终端
输入nproc
查看最高值)clangd.fallbackFlags
内的-std=c++20
:设置使用的C++标准
4. 额外配置#
接下来两个文件可以放在所有在项目文件夹同级目录下,这样就可以在所有项目中使用这两个文件了。
示例文件树:
/home/user/Code/C++
├── .clang-format
├── .clangd
├── project1
├── project2
.clang-format
:具体配置可以参考https://clang.llvm.org/docs/ClangFormatStyleOptions.html# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto Language: Cpp # BasedOnStyle: LLVM # 访问说明符(public、private等)的偏移 AccessModifierOffset: -4 # 开括号(开圆括号、开尖括号、开方括号)后的对齐: Align, DontAlign, AlwaysBreak(总是在开括号后换行) AlignAfterOpenBracket: Align # 连续赋值时,对齐所有等号 AlignConsecutiveAssignments: true # 连续声明时,对齐所有声明的变量名 AlignConsecutiveDeclarations: true # 左对齐逃脱换行(使用反斜杠换行)的反斜杠 AlignEscapedNewlinesLeft: true # 水平对齐二元和三元表达式的操作数 AlignOperands: true # 对齐连续的尾随的注释 AlignTrailingComments: true # 允许函数声明的所有参数在放在下一行 AllowAllParametersOfDeclarationOnNextLine: true # 允许短的块放在同一行 AllowShortBlocksOnASingleLine: false # 允许短的case标签放在同一行 AllowShortCaseLabelsOnASingleLine: false # 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All AllowShortFunctionsOnASingleLine: Empty # 允许短的if语句保持在同一行 AllowShortIfStatementsOnASingleLine: false # 允许短的循环保持在同一行 AllowShortLoopsOnASingleLine: false # 总是在定义返回类型后换行(deprecated) AlwaysBreakAfterDefinitionReturnType: None # 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), # AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义) AlwaysBreakAfterReturnType: None # 总是在多行string字面量前换行 AlwaysBreakBeforeMultilineStrings: false # 总是在template声明后换行 AlwaysBreakTemplateDeclarations: false # false表示函数实参要么都在同一行,要么都各自一行 BinPackArguments: true # false表示所有形参要么都在同一行,要么都各自一行 BinPackParameters: true # 大括号换行,只有当BreakBeforeBraces设置为Custom时才有效 BraceWrapping: # class定义后面 AfterClass: false # 控制语句后面 AfterControlStatement: false # enum定义后面 AfterEnum: false # 函数定义后面 AfterFunction: false # 命名空间定义后面 AfterNamespace: false # ObjC定义后面 AfterObjCDeclaration: false # struct定义后面 AfterStruct: false # union定义后面 AfterUnion: false # catch之前 BeforeCatch: true # else之前 BeforeElse: true # 缩进大括号 IndentBraces: false # 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行) BreakBeforeBinaryOperators: NonAssignment # 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似), # Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似), # Allman(总是在大括号前换行), GNU(总是在大括号前换行, # 并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom # 注:这里认为语句块也属于函数 BreakBeforeBraces: Allman # 在三元运算符前换行 BreakBeforeTernaryOperators: true # 在构造函数的初始化列表的逗号前换行 BreakConstructorInitializersBeforeComma: false # 每行字符的限制,0表示没有限制 ColumnLimit: 200 # 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变 CommentPragmas: '^ IWYU pragma:' # 构造函数的初始化列表要么都在同一行,要么都各自一行 ConstructorInitializerAllOnOneLineOrOnePerLine: false # 构造函数的初始化列表的缩进宽度 ConstructorInitializerIndentWidth: 4 # 延续的行的缩进宽度 ContinuationIndentWidth: 4 # 去除C++11的列表初始化的大括号{后和}前的空格 Cpp11BracedListStyle: false # 继承最常用的指针和引用的对齐方式 DerivePointerAlignment: false # 关闭格式化 DisableFormat: false # 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental) ExperimentalAutoDetectBinPacking: false # 需要被解读为foreach循环而不是函数调用的宏 ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] # 对#include进行排序,匹配了某正则表达式的#include拥有对应的优先级, # 匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前), # 可以定义负数优先级从而保证某些#include永远在最前面 IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(<|"(gtest|isl|json)/)' Priority: 3 - Regex: '.*' Priority: 1 # 缩进case标签 IndentCaseLabels: false # 缩进宽度 IndentWidth: 4 # 函数返回类型换行时,缩进函数声明或函数定义的函数名 IndentWrappedFunctionNames: false # 保留在块开始处的空行 KeepEmptyLinesAtTheStartOfBlocks: true # 开始一个块的宏的正则表达式 MacroBlockBegin: '' # 结束一个块的宏的正则表达式 MacroBlockEnd: '' # 连续空行的最大数量 MaxEmptyLinesToKeep: 1 # 命名空间的缩进: None, Inner(缩进嵌套的命名空间中的内容), All NamespaceIndentation: Inner # 使用ObjC块时缩进宽度 ObjCBlockIndentWidth: 4 # 在ObjC的@property后添加一个空格 ObjCSpaceAfterProperty: false # 在ObjC的protocol列表前添加一个空格 ObjCSpaceBeforeProtocolList: true # 在call(后对函数调用换行的penalty PenaltyBreakBeforeFirstCallParameter: 19 # 在一个注释中引入换行的penalty PenaltyBreakComment: 300 # 第一次在<<前换行的penalty PenaltyBreakFirstLessLess: 120 # 在一个字符串字面量中引入换行的penalty PenaltyBreakString: 1000 # 对于每个在行字符数限制之外的字符的penalty PenaltyExcessCharacter: 1000000 # 将函数的返回类型放到它自己的行的penalty PenaltyReturnTypeOnItsOwnLine: 60 # 指针和引用的对齐: Left, Right, Middle PointerAlignment: Left # 允许重新排版注释 ReflowComments: true # 允许排序#include SortIncludes: true # 在C风格类型转换后添加空格 SpaceAfterCStyleCast: false # 在赋值运算符之前添加空格 SpaceBeforeAssignmentOperators: true # 开圆括号之前添加一个空格: Never, ControlStatements, Always SpaceBeforeParens: ControlStatements # 在空的圆括号中添加空格 SpaceInEmptyParentheses: false # 在尾随的评论前添加的空格数(只适用于//) SpacesBeforeTrailingComments: 2 # 在尖括号的<后和>前添加空格 SpacesInAngles: false # 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格 SpacesInContainerLiterals: true # 在C风格类型转换的括号中添加空格 SpacesInCStyleCastParentheses: true # 在圆括号的(后和)前添加空格 SpacesInParentheses: false # 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响 SpacesInSquareBrackets: false # 标准: Cpp03, Cpp11, Auto Standard: Cpp11 # tab宽度 TabWidth: 4 # 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always UseTab: Never
.clangd
:具体配置可以参考https://clang.llvm.org/extra/clang-tidy/Index: Background: Build Diagnostics: ClangTidy: Add: ["*"] Remove: [ abseil*, fuchsia*, llvmlib*, zircon*, altera*, google-readability-todo, readability-braces-around-statements, hicpp-braces-around-statements, hicpp-signed-bitwise, modernize-use-trailing-return-type, readability-identifier-length, cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers, bugprone-easily-swappable-parameters, ]
5. 项目使用测试#
这里直接给出测试文件(C++的基础上测试opencv库、fmt库、eigen库使用,如果不需要,请手动去除对应部分)
先新建项目文件夹,然后在项目文件夹下,依次保存下面文件:
xmake.lua
add_rules("mode.debug", "mode.release") set_toolchains("clang") set_languages("c99", "c++20") add_rules("plugin.compile_commands.autoupdate", {outputdir = ".vscode"}) add_requires("opencv", {system = false ,configs = {shared = true, gtk = true}}) add_requires("fmt") add_requires("eigen") target("template") set_kind("binary") add_files("src/*.cpp") add_packages("opencv") add_packages("fmt") add_packages("eigen")
src
文件夹内main.cpp
#include <Eigen/Dense> #include <fmt/format.h> #include <opencv2/opencv.hpp> int main() { std::cout << "[成功]:std库测试:hello world!" << std::endl; Eigen::MatrixXd matrix1(2, 2); matrix1(0, 0) = 1; matrix1(0, 1) = 2; matrix1(1, 0) = 3; matrix1(1, 1) = 4; std::cout << "[成功]:Eigen库矩阵测试:matrix1 = " << std::endl << matrix1 << std::endl; fmt::print("[{}]:fmt库测试:输出\n", "成功"); cv::Mat image = cv::imread("../../../../data/1.jpg"); cv::imshow("[成功]:OpenCV库测试:显示", image); fmt::print("按任意键退出..\n"); cv::waitKey(0); return 0; }
然后在项目文件夹下新建data
文件夹,放入一张名为1.jpg
的图片
5.1 编译#
在vscode
下方状态栏的XMake(扩展)
中将Set build mode
设置为debug
;change the toolchain
设置为clang
然后看到Build the given target
,点击编译
第一次编译xmake
需要安装外部库,一路选y
就可以。
5.2 运行#
在编译完成后,点击Run the given target
,即可运行
5.3 调试#
在编译完成后,点击Debug the given target
,即可调试
可以打几个断点,然后调试