vscode安装配置clang-format
插件及使用
首先安装插件。在vscode扩展里搜索
clang-format
,安装排名第一的xaver.clang-format
。确认clang-format可执行程序路径
- windows用
eveything
查找一下clang-format.exe
,
最新的扩展 c/c++ 里集成了 clang-format。 如: c:\users\jack\.vscode\extensions\ms-vscode.cpptools-1.13.9-win32-x64\llvm\bin\clang-format.exe
。
- linux用命令
which clang-format
查询clang-format
的安装路径,如:/usr/bin/clang-format
。
如果没找到这个程序,走第3步。
如果已经有这个程序,走第4步。
- 安装真正的格式化工具
clang-format
。
- linux系统安装,使用命令
sudo apt install clang-format
; - windows系统安装,这个工具集成在工具包
llvm
里,下载地址:https://github.com/llvm/llvm-project/releases
如选择llvm-14.0.6-win64.exe
, 下载完成后不进行安装,解压这个exe文件,会得到clang-format.exe。把这个可执行文件复制到需要的地方就可以了。
- 把可执行程序的路径添加到
settings.json
文件里。
如果要所有工程都有效,要配置到vscode用户目录里,不是工作目录里的,
- windows目录是:
c:\users\jack\appdata\roaming\code\user\settings.json
- linux目录是
~/.config/code/user/settings.json
- 在配置文件里添加配置如下:
{ // clang-format 扩展的配置 "clang-format.style" : "file", "clang-format.assumefilename": "/home/user/.clang-format", "clang-format.executable": "/usr/bin/clang-format", "clang-format.fallbackstyle": "google", "editor.defaultformatter": "xaver.clang-format" }
如果是windows系统,修改可执行文件路径为实际路径,
如:"clang-format.executable": "c:\users\jack\.vscode\extensions\ms-vscode.cpptools-1.13.9-win32-x64\llvm\bin\clang-format.exe",
注意修改clang-format
风格配置文件路径,
如:"clang-format.assumefilename": "./.clang-format",
或:"clang-format.assumefilename": "/home/user/.clang-format",
或:"clang-format.assumefilename": "c:\users\jack\.vscode\.clang-format",
如果只配置当前工程,可以将配置添加到当前的code-workspace文件
"settings": { // clang-format 扩展的配置,覆盖用户的 `settings.json` // "clang-format.style" : "file:./.clang-format", //从指定配置文件读取格式化风格。 "clang-format.style" : "file", // 依次从当前目录、工作目录、path变量,加载默认风格配置文件(.clang-format)。 // 如果找不到则使用fallbackstyle, 没有fallbackstyle则默认llvm,c++。 "clang-format.assumefilename": "./.clang-format", //使用工作区独立配置文件 // "clang-format.assumefilename": "/home/user/.clang-format", //绝对路径,用于全局统一配置 "clang-format.executable": "/usr/bin/clang-format", "clang-format.fallbackstyle": "google", "editor.defaultformatter": "xaver.clang-format", // c/c++ 扩展的配置 // "c_cpp.formatting": "default", }
可以同时在全局的settings.json
和当前工程配置格式化配置文件,当前工程配置将覆盖全局配置。
因此可以在全局的settings.json
中配置全局的.clang-format
的绝对路径,如:"clang-format.assumefilename": "/home/user/.clang-format",
然后在当前工程配置使用当前目录下的.clang-format
,如:"clang-format.assumefilename": "./.clang-format",
- 生成.clang-format 配置文件并修改自定义
clang-format --style=google --dump-config > ./.clang-format
如下基于google的风格进行的定制
--- # https://clang.llvm.org/docs/clangformatstyleoptions.html basedonstyle: llvm language: cpp # this style configuration is based on google style configuration. # the following configuration is different from the basic configuration. # 缩进宽度 indentwidth: 4 # 访问权限说明符(public/private等)的偏移 accessmodifieroffset: -4 # # 开括号(开圆括号、尖括号、方括号)后的对齐: align, dontalign, alwaysbreak(总是在开括号后换行) # alignafteropenbracket: align # # 连续赋值时,对齐所有等号 # alignconsecutiveassignments: false # # 连续声明时,对齐所有声明的变量名 # alignconsecutivedeclarations: false # 反斜杆换行的对齐方式 # -- dontalign - 不进行对齐 # -- left - 反斜杠靠左对齐 # -- right - 反斜杠靠右对齐 # alignescapednewlines: right # 二元、三元表达式的对齐方式(当表达式需要占用多行时) # -- dontalign - 不进行对齐 # -- align - 从操作符开始对齐 # -- alignafteroperator - 从操作数开始对齐 alignoperands: true # # 是否对齐行尾注释 # aligntrailingcomments: true # # 函数声明的所有参数在放在下一行 # allowallparametersofdeclarationonnextline: false # # 是否允许短的代码块放在同一行 # allowshortblocksonasingleline: false # # 短的case标签和语句放在同一行 # allowshortcaselabelsonasingleline: true # # 短的函数放在同一行 # -- none - 不把短的函数放在同一行 # -- inlineonly - 只把类内的内联函数放在同一行,全局的空函数不放在同一行 # -- empty - 只把空的函数放在同一行 # -- inline - 把类内的内联函数放在同一行,全局的空函数不放在同一行 # -- all - 都允许放在同一行 allowshortfunctionsonasingleline: inlineonly # # 短的if语句保持在同一行 # allowshortifstatementsonasingleline: true # # 短的循环保持在同一行 # allowshortloopsonasingleline: true # # 总是在返回类型后换行: none, all, toplevel(顶级函数,不包括在类中的函数), # # alldefinitions(所有的定义,不包括声明), topleveldefinitions(所有的顶级函数的定义) # alwaysbreakafterreturntype: none # # 总是在多行string字面量前换行 # alwaysbreakbeforemultilinestrings: true # # 总是在template声明后换行 alwaysbreaktemplatedeclarations: true # # 函数调用时,参数的放置规则 # -- false - 参数要么放在同一行,要么每个参数占用一行 # -- true - 不做强制要求 # binpackarguments: true # 函数声明、定义时,参数的放置规则 # -- false - 参数要么放在同一行,要么每个参数占用一行 # -- true - 不做强制要求 # binpackparameters: true # 大括号放置风格 # -- attach - 大括号紧随前方内容,放在同一行 # -- linux - 与 attach 类似,除了 函数、命名空间、类定义 的大括号放在下一行 # -- mozilla - 与 attach 类似,除了枚举、函数、结构(class\struct\union)的大括号放在下一行 # -- stroustrup - 与 attach 类似,但函数定义前、catch前方、else前方的"{}"放在单独一行 # -- allman - 总是换行 # -- whitesmiths - 类似 allman,但"{}"和内部的语句对齐到同样位置 # -- gnu - 总是换行,但在控制语句后的"{}"总是对齐到下一个位置 # -- webkit - 与 attach 类似,但在函数定义前换行 # -- custom - 依赖 bracewrapping # 注:这里认为语句块也属于函数 breakbeforebraces: custom # 大括号换行,只有当breakbeforebraces设置为custom时才有效 bracewrapping: # class定义后面 afterclass: true # 控制语句后面 aftercontrolstatement: false # enum定义后面 afterenum: false # 函数定义后面 afterfunction: true # 命名空间定义后面 afternamespace: true # objc定义后面 afterobjcdeclaration: false # struct定义后面 afterstruct: false # union定义后面 afterunion: false # extern之后 afterexternblock: true # catch之前 beforecatch: false # else之前 beforeelse: false # 继续缩进大括号 indentbraces: false # 分离空函数 # # 当空白函数的"{}"和函数名称不需要放在同一行时,是否拆分函数体 splitemptyfunction: true # 分离空语句 # # 当空白结构(class\struct\union)的"{}"需要放在单独的行时,是否拆分"{}" splitemptyrecord: true # 分离空命名空间 # # 当空白的命名空间的"{}"需要放在单独的行时,是否拆分"{}" splitemptynamespace: true # # 在二元运算符前换行: none(在操作符后换行), nonassignment(在非赋值的操作符前换行), all(在操作符前换行) breakbeforebinaryoperators: nonassignment # breakbeforeinheritancecomma: false # # 在三元运算符前换行 # 当三元表达式不能放在同一行时,是否在三元操作符前方换行 # -- true - 操作符位于新行的首部 # -- false - 操作符位于上一行的尾部 breakbeforeternaryoperators: true # breakconstructorinitializersbeforecomma: false # # 构造函数初始化列表分割方式 # -- beforecolon - 在冒号 ':' 前方分割,冒号位于行首,逗号','位于行尾 # -- beforecomma - 在冒号和逗号前方分割,冒号和逗号都位于行首,并且对齐 # -- aftercolon - 在冒号和逗号后方分割,冒号和逗号位于行尾 breakconstructorinitializers: beforecolon # # 是否在每个java注解后方换行 # breakafterjavafieldannotations: false # # 是否分割过长的字符串 # breakstringliterals: false # # 每行字符长度的限制,0表示没有限制 columnlimit: 100 # # 用于匹配注释信息的正则表达式,被匹配的行不会做任何修改 # commentpragmas: '^ iwyu pragma:' # 是否压缩紧接的命名空间 # -- true - 将紧跟的命名空间放在同一行 # -- false - 每个命名空间位于新的一行 compactnamespaces: false # # 构造函数的初始化列表要么都在同一行,要么都各自一行 # -- true - 如果可能,初始化列表放在同一行;如果不满足长度选择,则每个单独放一行 # -- false - 初始化列表可以随意放置 # constructorinitializerallononelineoroneperline: false # # 构造函数的初始化列表和基类集成列表的对齐宽度 constructorinitializerindentwidth: 4 # # 延续语句的对齐宽度 continuationindentwidth: 4 # # 去除c++11的列表初始化的大括号{后和}前的空格 cpp11bracedliststyle: true # 是否自动分析指针的对齐方式 # -- true - 自动分析并使用指针的对齐方式,若无法分析,则使用 pointeralignment # -- false - 不自动分析 # derivepointeralignment: true # 是否禁用格式化 disableformat: false # experimentalautodetectbinpacking: false # 是否自动修正命名空间的结束注释 # -- true - 在短的命名空间尾部,自动添加或修改错误的命名空间结束注释 # -- false - 不自动修正 fixnamespacecomments: true # foreach 循环 foreachmacros: - foreach - q_foreach - boost_foreach # 多个 include 块(有空行分隔的include)排序时的分组规则 # -- preserve - 保留原有的块分隔,各自排序 # -- merge - 将所有的块视为同一个,然后进行排序 # -- regroup - 将所有的块视为同一个进行排序,然后按照 includecategories 的规则进行分组 includeblocks: preserve # includecategories: # - regex: '^<ext/.*\.h>' # priority: 2 # - regex: '^<.*\.h>' # priority: 1 # - regex: '^<.*' # priority: 2 # - regex: '.*' # priority: 3 # includeismainregex: '([-_](test|unittest))?$' # # 缩进case标签 # -- true - case 不与 switch 对齐 # -- false - case 和 switch 对齐 indentcaselabels: true # 预处理命令(#if\#ifdef\#endif等)的缩进规则 # -- none - 不进行缩进 # -- afterhash - 在前导'#'后缩进,'#'放在最左侧,之后的语句参与缩进 # -- beforehash - 在前导'#'前进行缩进 indentppdirectives: afterhash # # 函数返回类型换行时,缩进函数声明或函数定义的函数名 # indentwrappedfunctionnames: false # javascript 中的字符串引号规则 # -- leave - 保持原样 # -- single - 全部使用单引号 # -- double - 全部使用双引号 javascriptquotes: leave # 是否在 javascript 的 import/export 语句后换行 # javascriptwrapimports: true # # 保留在块开始处的空行 # -- true - 保留块起始的空行 # -- false - 删除块起始的空行 keepemptylinesatthestartofblocks: true # 用于识别宏定义型块起始的正则表达式 # macroblockbegin: '' # 用于识别宏定义型块结束的正则表达式 # macroblockend: '' # # 连续空行的最大数量 maxemptylinestokeep: 1 # # 命名空间内部的缩进规则 # -- none - 都不缩进 # -- inner - 只缩进嵌套的命名空间内容 # -- all - 缩进所有命名空间内容 namespaceindentation: inner # objective-c 相关配置 # objcblockindentwidth: 2 # objcspaceafterproperty: false # objcspacebeforeprotocollist: false # penaltybreakassignment: 2 # penaltybreakbeforefirstcallparameter: 1 # penaltybreakcomment: 300 # penaltybreakfirstlessless: 120 # penaltybreakstring: 1000 # penaltyexcesscharacter: 1000000 # penaltyreturntypeonitsownline: 200 # # 指针和引用(*和&)的对齐规则 # -- left - * 靠近左侧 # -- right - * 靠近右侧 # -- middle - * 放在中间 # note : 在 spacearoundpointerqualifiers 为 default, # 且 derivepointeralignment 失效后启用 pointeralignment: right # rawstringformats: # - delimiter: pb # language: textproto # basedonstyle: google # # 重新排版注释 reflowcomments: false # # 重新排序#include # -- never - 不进行排序 # -- casesensitive - 排序时大小写敏感 # -- caseinsensitive - 排序时大小写不敏感 sortincludes: false # java 中静态 import 的排序规则 # -- before - 静态放在非静态前方 # -- after - 静态放在非静态后方 # sortjavastaticimport: before # # 重新排序using声明 sortusingdeclarations: false # # 在c风格类型转换后添加空格 spaceaftercstylecast: false # # 在template关键字后面添加空格 spaceaftertemplatekeyword: true # # 在赋值运算符之前添加空格 spacebeforeassignmentoperators: true # # 在 c++11 的初始化列表前加空格 # spacebeforecpp11bracedlist: true # 在构造函数的初始化冒号":"前加空格 # spacebeforectorinitializercolon: true # 在构造函数的继承冒号":"前加空格 # spacebeforeinheritancecolon: true # 小括号"()"前加空格的规则 # -- never - 从不加空格 # -- controlstatements - 只在控制语句(for/if/while...)时加空格 # -- controlstatementsexceptforeachmacros - 类型 controlstatements,只是不再 foreach 后加空格 # -- always - 总是添加空格 # -- nonemptyparentheses - 类似 always,只是不再空白括号前加空格 spacebeforeparens: controlstatements # 在 for 循环的冒号":"前加空格 # spacebeforerangebasedforloopcolon: true # # 在空白的小括号"()"中添加空格 spaceinemptyparentheses: false # # 在行尾的注释前添加的空格数(只适用于//) spacesbeforetrailingcomments: 1 # # 在尖括号的"<"后,和">"前添加空格 spacesinangles: false # # 在容器(objc和javascript的数组和字典等)字面量中添加空格 spacesincontainerliterals: true # # 在c风格类型转换的括号中添加空格 spacesincstylecastparentheses: false # # 在圆括号的"("后,和")"前添加空格 spacesinparentheses: false # 在中括号中加空格 # 当中括号内没有数据时,不受本规则影响(如空白的lambda 捕获表、不定长度的数组声明) spacesinsquarebrackets: false # 语言标准: cpp03, cpp11, auto standard: auto # # tab宽度 tabwidth: 4 # # 使用tab字符: never, forindentation, forcontinuationandindentation, always usetab: never ---
可以将.clang-format
文件放置在当前工作目录,或父目录,仅供当前项目使用。
也可以将.clang-format
文件放置在用户宿主目录,在配置文件中使用绝对路径,供所有项目使用。
- 格式化代码
- 在代码页面按
<ctrl-shift-f>
,选择使用…格式化代码
(format document with...
),选择clang-format
。 - 全选代码,鼠标右键,
使用…格式化代码
(format document with...
),选择clang-format
。
到此这篇关于vscode安装配置clang-format插件及使用小结的文章就介绍到这了,更多相关vscode安装配置clang-format内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论