跳过正文
  1. 文章/

ArchLinux平台 C/C++开发配置

··1819 字·9 分钟
代码 Archlinux Vscode C++ Clangd Xmake Lldb Code
目录
开发环境配置 - 系列文章
§ : 本文

0. 写在开头
#

在配置好代理和软件源的情况下,配置开发环境。

1. 基本信息与软件安装
#

  • System: Arch Linux x86_64
  • IDE: VSCode
  • LSP: clangd
  • Compiler: clang
  • Debugger: lldb
  • Build System: xmake
  1. 终端依次输入下列命令安装软件:

    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
    
  2. 依次输入下列命令检查是否正确安装:

    clang -v
    clangd -v
    clang-tidy --version
    clang-format --version
    lldb --version
    xmake --version
    

2. vscode 基础配置与插件
#

基础配置作为所有配置的基础和平时的编辑器使用

2.1 vscode 基础插件
#

进入vscode,点击扩展,依次输入下列内容安装显示的第一个插件

  1. MS-CEINTL.vscode-language-pack-zh-hans:中文语言包
  2. intellsmi.comment-translate:注释翻译
  3. deeplx-comment-translate.deeplx-comment-translate:注释翻译扩展,使其可以使用Deeplx
  4. usernamehw.errorlens:代码错误提示
  5. eamodio.gitlens:git工具
  6. tamasfe.even-better-toml:TOML语法高亮
  7. cweijan.vscode-office:vscode内office文件预览和markdown预览
  8. github.copilot:AI代码提示
  9. github.copilot-chat:AI代码对话
  10. fisheva.eva-theme:vscode颜色主题
  11. miguelsolorio.fluent-icons:vscode产品图标主题
  12. wayou.vscode-icons-mac:vscode文件图标主题
  13. 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):

  1. editor.codeLensFontFamily:CodeLens(提示)字体
  2. editor.fontFamily:字体
  3. editor.fontSize:字号
  4. terminal.integrated.fontSize:终端字号
  5. notebook.output.fontFamily:笔记本输出区域字体
  6. scm.inputFontSize:源代码管理字号
  7. errorLens.fontSize:ErrorLens插件字号
  8. github.copilot.advancedgithub-enterprise.uri:GitHub Copilot插件的外部API设置(如果是官方copilot,可以不设置)
  9. 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,点击扩展,依次输入下列内容安装显示的第一个插件

  1. xaver.clang-format:使用.clang-format文件进行代码格式化
  2. llvm-vs-code-extensions.vscode-clangd:clangd插件
  3. vadimcn.vscode-lldb:lldb调试插件
  4. ajshort.include-autocomplete:头文件自动补全
  5. tboox.xmake-vscode:xmake构建系统
  6. 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 输出详细日志
}

在复制粘贴完上面内容后,可能需要修改以下自定义配置:

  1. clangd.path:指定clangd的路径,根据自己的clangd安装路径进行修改
  2. clang-format.executable:指定clang-format的路径,根据自己的clang-format安装路径进行修改
  3. clangd.arguments内的-j=16:设置同时开启的任务数量,根据自己的电脑性能进行修改(可在终端输入nproc查看最高值)
  4. clangd.fallbackFlags内的-std=c++20:设置使用的C++标准

4. 额外配置
#

接下来两个文件可以放在所有在项目文件夹同级目录下,这样就可以在所有项目中使用这两个文件了。

示例文件树:

/home/user/Code/C++
├── .clang-format
├── .clangd
├── project1
├── project2
  1. .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
    
  2. .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库使用,如果不需要,请手动去除对应部分)

先新建项目文件夹,然后在项目文件夹下,依次保存下面文件:

  1. 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")
    
  2. 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设置为debugchange the toolchain设置为clang

然后看到Build the given target,点击编译

第一次编译xmake需要安装外部库,一路选y就可以。

5.2 运行
#

在编译完成后,点击Run the given target,即可运行

5.3 调试
#

在编译完成后,点击Debug the given target,即可调试

可以打几个断点,然后调试

参考资料
#

xiadengma
作者
xiadengma
开发环境配置 - 系列文章
§ : 本文