vscode 配置 clangd 和 clang-format
clangd
clangd
是一个基于 clang
的 C/C++ 语言服务器,提供了代码补全、静态分析等功能。相较于 vscode 自带的 C/C++ 插件,clangd
不需要配置 c_cpp_properties.json
,并且在大型项目中的性能表现更好。
本文假设已经安装了 vscode 并安装了 C/C++ Extension Pack
插件。
安装 & 配置
使用包管理器安装 clangd
:
1 2 3
| sudo apt install clangd
sudo apt install clangd-19
|
安装完成后,确保 clangd
可执行文件在系统的 PATH
中,可以通过以下命令检查:
搜索 vscode 插件 clangd
,在 vscode 中搜索 clangd
并安装;
安装 clangd
插件时,会询问是否安装 clangd
,可以比较一下包管理器安装的版本和插件安装的版本,选择较新的版本安装。
禁用 vscode 自带的 C/C++ 插件,避免冲突;
勾选 cmake tools
插件设置中 Export Compile Commands
选项,以生成 compile_commands.json
文件;
在 clangd
插件设置中 Arguments
选项中添加 --compile-commands-dir=${workspaceFolder}/build
,指定 compile_commands.json
文件所在目录;
clangd
插件会寻找系统中的 clangd
可执行文件,如果使用包管理器安装了指定版本的 clangd
,需要在 clangd
插件设置中 Path
选项中指定带版本号的 clangd
可执行文件(如 clangd-19
),或者创建一个符号链接 clangd
指向指定版本的 clangd
可执行文件。
clangd
的配置文件为 .clangd
,可以参考 官方文档 进行配置,也可以不配置,使用默认配置即可。
使用
打开一个 C/C++ 项目,clangd
会自动读取 compile_commands.json
文件并进行代码补全和静态分析,若没有生成 compile_commands.json
文件,使用 cmake
生成即可。
截至文档发布,clangd
仍不支持解析 doxygen
格式的注释。
clang-format
是一个代码格式化工具,可以根据预定义的风格对 C/C++ 代码进行格式化。clang-format
支持多种风格,包括 LLVM
、Google
、Chromium
、Mozilla
和 WebKit
,也可以自定义风格。
安装 & 配置
clang-format
的安装方式与 clangd
类似,直接通过包管理安装即可,vscode 安装 clang-format
插件后会自动检测系统中的 clang-format
可执行文件。
clang-format
的配置文件为 .clang-format
,可以参考 官方文档 进行配置。如果项目中没有 .clang-format
文件,会尝试使用用户目录下的 .clang-format
文件。
下面是笔者使用的 .clang-format
配置文件,注释是 ai 补的,可能需要中译中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| AccessModifierOffset: -4 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Left AlignOperands: true AlignTrailingComments: false AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: None AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: false BinPackArguments: true BinPackParameters: true BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false AfterFunction: true AfterNamespace: true AfterObjCDeclaration: false AfterStruct: false AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: None BreakBeforeBraces: Custom BreakBeforeInheritanceComma: false BreakBeforeTernaryOperators: false BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeComma BreakAfterJavaFieldAnnotations: false BreakStringLiterals: false CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: false DerivePointerAlignment: false ExperimentalAutoDetectBinPacking: false FixNamespaceComments: false IncludeBlocks: Preserve IncludeCategories: - Regex: '.*' Priority: 1 IndentCaseLabels: false IndentGotoLabels: false IndentPPDirectives: None IndentWidth: 4 IndentWrappedFunctionNames: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 4 ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 10 PenaltyBreakBeforeFirstCallParameter: 30 PenaltyBreakComment: 10 PenaltyBreakFirstLessLess: 0 PenaltyBreakString: 10 PenaltyExcessCharacter: 100 PenaltyReturnTypeOnItsOwnLine: 100 PointerAlignment: Right ReflowComments: true SortIncludes: false SortUsingDeclarations: false SpaceAfterCStyleCast: false SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatementsExceptForEachMacros SpaceBeforeRangeBasedForLoopColon: true SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false SpacesInContainerLiterals: false SpacesInCStyleCastParentheses: false SpacesInParentheses: false SpacesInSquareBrackets: false TabWidth: 4 UseTab: false
|