博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vim代码格式化插件clang-format
阅读量:4676 次
发布时间:2019-06-09

本文共 10882 字,大约阅读时间需要 36 分钟。


title: vim代码格式化插件clang-format

date: 2017-12-12 20:28:26
tags: vim
categories: 开发工具


安装vim-clang-format插件

项目地址:

如果用Vundle管理vim插件,直接在.vimrc中添加一行

Plugin 'vim-clang-format'

运行:PluginInstall就可以自动安装插件

"配置let g:clang_format#auto_format_on_insert_leave=1    "退出插入模式时自动格式化

支持的语言

  • C
  • C++
  • Objective-C
  • JavaScript
  • java
  • TypeScript
  • Protobuf

需要事先安装clang-format

clang-format

$ pacman -S clang-format

配置信息

BasedOnStyle (string)这个样式用于所有没有特殊指定配置的选项。 这个选项仅在clang-format配置中支持(在-style='{...}' 和 .clang-format 文件里). 可能的值有: LLVM:符合LLVM代码标准的样式Google:符合谷歌的c++样式指南的样式Chromium:符合Chromium样式指南的样式Mozilla:符合Mozilla样式指南的样式WebKit:符合WebKit的样式指南的样式AccessModifierOffset (int)访问修饰符的缩进或者向外伸展,例如 public:。AlignAfterOpenBracket (BracketAlignmentStyle)如果为真(true),在一个左圆括号后水平对齐参数这会应用在圆括号,尖括号和中(方)括号。可能的值有:BAS_Align (在配置中: Align) 在左圆括号后调整参数, 例如:someLongFunction(argument1,                 argument2); BAS_DontAlign (在配置中: DontAlign) 不调整, 换用 ContinuationIndentWidth, 例如:someLongFunction(argument1,    argument2); BAS_AlwaysBreak (在配置中: AlwaysBreak) 在左圆括号后总是换行, 如果参数不能适应单行, 例如:someLongFunction(    argument1, argument2); AlignConsecutiveAssignments (bool)如果为真(true),连续调整多行这将会调整连续行中的分配操作符。这将会导致像下面这样的格式:int aaaa = 12;int b    = 23;int ccc  = 23; AlignConsecutiveDeclarations (bool)如果为真(true), 校准连续的声明。 这将会校准连续多行的声明的名字。这将会导致像下面这样的格式:int         aaaa = 12;float       b = 23;std::string ccc = 23; AlignEscapedNewlinesLeft (bool)如果为真(true), 校准被忽略的新行距左边尽可能远。或者把它们放到列的最右边 AlignOperands (bool)如果为真(true), 水平对齐二进制和三元表达式的操作数。具体来说,这将一个表达式的操作数对准一个需要被分割的多行的操作数, 例如:int aaa = bbbbbbbbbbbbbbb +          ccccccccccccccc; AlignTrailingComments (bool)如果为真(true), 对齐注释。 AllowAllParametersOfDeclarationOnNextLine (bool)即使BinPackParameters是假的,也允许将一个函数声明的所有参数移到下一行. AllowShortBlocksOnASingleLine (bool)允许将简单的语句块放到一个单行.例如, 这允许 将 语句 “if (a) { return; }” 放到一个单行. AllowShortCaseLabelsOnASingleLine (bool)如果为真(true), 很短的情况下的标签将会被放到单独的行。 AllowShortFunctionsOnASingleLine (ShortFunctionStyle)取决于值, 语句“int f() { return 0; }”可以被放到一个单行。可能的值有:SFS_None (在配置中: None) 从不合并方法或函数到单独的一行。SFS_Empty (在配置中: Empty) 仅合并空的函数。SFS_Inline (在配置中: Inline) 仅合并类中定义的方法或函数. 意味着 “empty”.SFS_All (在配置中: All) 合并所有的方法适应单行. AllowShortIfStatementsOnASingleLine (bool)如果为真(true), 语句“if (a) return;” 能被放到单行。 AllowShortLoopsOnASingleLine (bool)如果为真(true), 语句“while (true) continue;” 能被放到单行。 AlwaysBreakAfterDefinitionReturnType (DefinitionReturnTypeBreakingStyle)用于函数定义返回类型换行样式。这个选项是过时的并且被保留向后兼容。可能的值有:DRTBS_None (在配置中: None) 再返回类型后自动换行。PenaltyReturnTypeOnItsOwnLine 会被考虑到.DRTBS_All (在配置中: All) 总是在返回类型后换行。DRTBS_TopLevel (在配置中: TopLevel) 总是在返回类型的顶级函数后换行。 AlwaysBreakAfterReturnType (ReturnTypeBreakingStyle)用于函数声明返回类型换行样式。可能的值有: RTBS_None (在配置中: None) 在返回类型后自动换行。“PenaltyReturnTypeOnItsOwnLine”会被考虑.RTBS_All (在配置中: All) 再返回类型后总是换行。RTBS_TopLevel (在配置中: TopLevel) 在方法的顶层的返回类型后总是换行。RTBS_AllDefinitions (在配置中: AllDefinitions) 在方法定义中的返回类型后总是换行。RTBS_TopLevelDefinitions (在配置中: TopLevelDefinitions) 在顶层定义的返回类型后总是换行。 AlwaysBreakBeforeMultilineStrings (bool)如果为真(true), 在多行字面量字符串前总是换行。这个标志意味着使在文件中有多行字符串的情况看起来更一致。因此,如果字符串被“ContinuationIndentWidth”空格导致换行,它将会在行首生效。 AlwaysBreakTemplateDeclarations (bool)如果为真(true), 在模板声明“template<...>”后总是换行 BinPackArguments (bool)如果为假(false), 函数调用的参数要么是在同一行上,要么将在同一行上有一行。 BinPackParameters (bool)如果为假(false), 函数声明或函数定义的参数将都在同一行上,或各有一行。 BraceWrapping (BraceWrappingFlags)控制单独的大括号换行事件。如果“BreakBeforeBraces”设置为“BS_Custom”, 使用这个指定如何处理每个单独的括号的情况。否则,这是被忽略的。嵌套结构的标志:bool AfterClass 使类定义换行.bool AfterControlStatement 使控制语句(if/for/while/switch/..)换行。bool AfterEnum 使枚举定义换行。bool AfterFunction 使方法定义换行。bool AfterNamespace 使命名空间定义换行。bool AfterObjCDeclaration 使OC定义(@autoreleasepool, interfaces, ..)换行。bool AfterStruct 使结构定义换行。bool AfterUnion 使共同体定义换行。bool BeforeCatch 在catch之前换行。bool BeforeElse 在else之前换行。bool IndentBraces 缩进换行的大括号。 BreakAfterJavaFieldAnnotations (bool)在JAVA文件中每个注释后换行。 BreakBeforeBinaryOperators (BinaryOperatorStyle)使二进制操作符换行的方法。可能的值有:BOS_None (在配置中: None) 在操作符后换行。BOS_NonAssignment (在配置中: NonAssignment) 在操作符没有被指定前换行。BOS_All (在配置中: All) 在操作符前换行。 BreakBeforeBraces (BraceBreakingStyle)用于大括号换行样式。可能的值有:BS_Attach (在配置中: Attach) 总是将大括号与上下文连在一起。BS_Linux (在配置中: Linux) 像Attach一样, 但是在一个方法、命名空间或一个类定义的大括号之前换行BS_Mozilla (在配置中: Mozilla) 像Attach一样, 但是在一个枚举、方法或记录定义前换行。BS_Stroustrup (在配置中: Stroustrup) 像Attach一样,但是在方法定义、catch、和else前换行BS_Allman (在配置中: Allman) 总是在大括号之前换行。BS_GNU (在配置中: GNU) 总是在括号前中断,并添加一个额外的级别的缩进到控件语句的括号中,而不是类、函数或其他定义的括号中。BS_WebKit (在配置中: WebKit) 像Attach一样, 但是在方法前换行。BS_Custom (在配置中: Custom) 在“BraceWrapping”里配置每一个单独的大括号。 BreakBeforeTernaryOperators (bool)如果为真(true), 三元运算符将被放置在换行后。 BreakConstructorInitializersBeforeComma (bool)总是在逗号和对齐逗号跟冒号前把构造函数初始化式换行。 BreakStringLiterals (bool)当格式化时,总是对字面量字符串换行。ColumnLimit (unsigned)限制列。列的限制为0意味着没有列限制。在这种情况下,clang-format将谨慎对待在声明中输入行的换行决定,除非与其他规则矛盾。 CommentPragmas (std::string)一个固定的表达式,它描述了具有特殊意义的注释,不应该被分裂成行或以其他方式改变。 ConstructorInitializerAllOnOneLineOrOnePerLine (bool)如果构造函数初始化器不适合在一行,把每个初始化放到单独的行。 ConstructorInitializerIndentWidth (unsigned)使用构造函数初始化列表缩进的字符数。 ContinuationIndentWidth (unsigned)新行缩进宽度。 Cpp11BracedListStyle (bool)如果为真(true),格式化大括号列表达到最适合c++11列表。 重要区别:-没有空格内的大括号列表。-大括号关闭前没有换行。与延续缩进缩进,不与块缩进。从根本上讲,C++ 11大括号列表与函数调用格式化是一模一样的。如果大括号列表跟着一个名字(例如类型或变量名),clang-format的格式像是一个调用那个名字的函数的圆括号的“{}”。如果没有名称,则假定一个零长度的名称。 DerivePointerAlignment (bool)如果为真(true), 分析最常见的格式化文件中“&”和“\*”的对齐方式。pointeralignment则仅作为后备。 DisableFormat (bool)完全禁止格式化。 ExperimentalAutoDetectBinPacking (bool)如果为真(true), clang-format检测函数调用和定义格式化为每行一个参数。每个调用都可以被包装,每行一个或不确定的。如果是不确定的,例如完全在一行,但需要做出一个决定,clang-format分析文件中是否有其他被包装的事例和相应的行动。注意:这是一个实验标志,可能会消失或被重命名。不要在配置文件中使用。你自己要为你的使用负责。 ForEachMacros (std::vector
)一个宏,应解释为foreach循环而不是作为函数调用矢量。这些都是预期形式的宏: FOREACH(
, ...)
在.clang-format 配置文件中, 这可以被设定为:ForEachMacros: ['RANGES_FOR', 'FOREACH']例如: BOOST_FOREACH. IncludeCategories (std::vector
)正则表达式表示不同的#include类别被用于#includes命令。这些正则表达式与一个包含(包括< >或“)的文件的文件名相匹配。属于第一匹配正则表达式的值被分配,并且#include首先根据增加类别数然后在每个类别按字母的顺序排序。 如果正则表达式都不匹配,int_max分配类别。源文件的主要头引用自动获取类别0。因此,它通常是保持在#include开头(http://llvm.org/docs/CodingStandards.html#include-style)。然而,如果你有总是需要排在首位的头引用,你也可以分配负面的优先事项。为了在.clang-format文件中配置这个, 请使用:IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(<|"(gtest|isl|json)/)' Priority: 3 - Regex: '.\*' Priority: 1 IncludeIsMainRegex (std::string)指定一个常用的可以在文件主要包括映射的正则表达式的表达式。在猜测是否#include是“main”include(指定类别0,见上文),使用这个正则表达式允许后缀的头引用源。部分匹配完成,所以说:-“”意思是任意后缀,-“$”的意思是没有后缀例如,如果配置”(_test)?$”,然后.h将被视为包括在a.cc和a_test.ccde中的“main”。 IndentCaseLabels (bool)从switch语句缩进case标签一级。当错误时,使用相同的缩进级别作为切换语句。switch语句的语句体总是缩进一级以上的case标签。 IndentWidth (unsigned)用于缩进的列数。 IndentWrappedFunctionNames (bool)缩进如果函数定义或声明后包的类型。 JavaScriptQuotes (JavaScriptQuoteStyle)JavaScriptQuoteStyle 使用JavaScript字符串。可能的值有:JSQS_Leave (在配置中: Leave) 留下字符串原本的括号JSQS_Single (在配置中: Single) 总是使用单括号JSQS_Double (在配置中: Double) 总是使用双括号. KeepEmptyLinesAtTheStartOfBlocks (bool)如果为真(true), 保持块的起始空行。 Language (LanguageKind)这种格式针对的是语言。可能的值有:LK_None (在配置中: None) 不使用LK_Cpp (在配置中: Cpp) 应该被用于C, C++, ObjectiveC, ObjectiveC++.LK_Java (在配置中: Java) 应该被用于Java.LK_JavaScript (在配置中: JavaScript) 应该被用于 JavaScript.LK_Proto (在配置中: Proto) 应该被用于 Protocol 缓冲 (https://developers.google.com/protocol-buffers/).LK_TableGen (在配置中: TableGen) 应该被用于 TableGen 代码. MacroBlockBegin (std::string)匹配宏指令的一个常用于开始一个块的表达式。 MacroBlockEnd (std::string)匹配宏指令的一个常用于结束一个块的表达式。 MaxEmptyLinesToKeep (unsigned)连续空行的最大数。 NamespaceIndentation (NamespaceIndentationKind)用于命名空间的缩排。可能的值有:NI_None (在配置中: None) 在命名空间中不缩进。NI_Inner (在配置中: Inner) 仅在内部命名空间缩进(嵌套在其他命名空间)。NI_All (在配置中: All) 在所有的命名空间中缩进。 ObjCBlockIndentWidth (unsigned)OC块中所拍的字符数。 ObjCSpaceAfterProperty (bool)在OC中的@property后面添加一个空格。例如:使用“@property (readonly)”而不是“@property(readonly)”。 ObjCSpaceBeforeProtocolList (bool)在OC协议列表前添加一个空格, 例如: 使用
而不是
。 PenaltyBreakBeforeFirstCallParameter (unsigned)在调用小括号“(”后给一个方法调用换行的处罚。 PenaltyBreakComment (unsigned)包含在一个注释中的每一个换行的处罚。 PenaltyBreakFirstLessLess (unsigned)在第一个“<<”前的换行的处罚。 PenaltyBreakString (unsigned)包含一个字面量的字符串中的每一个换行的处罚。 PenaltyExcessCharacter (unsigned)每一个字符的列限制外的处罚。 PenaltyReturnTypeOnItsOwnLine (unsigned)把一个方法返回类型放到函数的同一行。 PointerAlignment (PointerAlignmentStyle)指针和引用的对其方式。可能的值有:PAS_Left (在配置中: Left) 指针左对齐。PAS_Right (在配置中: Right) 指针右对齐。PAS_Middle (在配置中: Middle) 指针中间对齐。 ReflowComments (bool)如果为真(true), clang-format 将会尝试将注释重新流布局。 SortIncludes (bool)如果为真(true), clang-format 将会分类#includes. SpaceAfterCStyleCast (bool)如果为真(true), 可能在一个C样式描述后插入一个空格。 SpaceAfterTemplateKeyword (bool)如果为真(true), 在“template”关键字后插入一个空格。 SpaceBeforeAssignmentOperators (bool)如果为假(false),移除分配操作符(=)前空格。 SpaceBeforeParens (SpaceBeforeParensOptions)大括号之前定义空格的情况。可能的值有:SBPO_Never (在配置中: Never) 从不在圆括号之前加空格。SBPO_ControlStatements (在配置中: ControlStatements) 仅在控制声明关键词(for/if/while···)的圆括号前面加空格。SBPO_Always (在配置中: Always) 总在圆括号前面加空格, 除了语法规则禁止的(在方法中-像宏定义)或者 当其他样式规则定义过的(在一元运算符后,圆括号, 等等) SpaceInEmptyParentheses (bool)如果为真(true), 可能会在“()”中插入空格。 SpacesBeforeTrailingComments (unsigned)单行注释前的空格数(// - comments)。这不会影响块注释(/* - comments),因为它们通常会有不同的使用模式和一些特殊情况。 SpacesInAngles (bool)如果为真(true), 将会在模板对齐列的“<>”中间插入空格。 SpacesInCStyleCastParentheses (bool)如果为真(true), 将会在C样式描述中插入空格。 SpacesInContainerLiterals (bool)如果为真(true), 将会在字面量容器中插入空格(例如 OC和Javascript的数组和字典字面量)。 SpacesInParentheses (bool)如果为真(true), 将会在“(”之后和“)”之前插入空格。 SpacesInSquareBrackets (bool)如果为真(true),将会在“[”之后和“]”之前插入空格。 Standard (LanguageStandard)用这个标准格式化:例如:在LS_Cpp03中使用 A
> 而不是 A
>可能的值有:LS_Cpp03 (在配置中: Cpp03) 使用Use C++03统一语法。LS_Cpp11 (在配置中: Cpp11) 使用C++11的特征(例如 A
>而不是A
>).LS_Auto (在配置中: Auto) 基于输入自动检查。TabWidth (unsigned)用于制表符停止的列数。 UseTab (UseTabStyle)在结果文件中使用制表符字符的方式。可能的值有:UT_Never (在配置中: Never) 从不使用制表符。UT_ForIndentation (在配置中: ForIndentation) 仅缩排时使用制表符。UT_Always (在配置中: Always) 使用标签时,我们需要填补的空白,至少从一个制表位到下一个。

配置文件位置~/.clang-format

我的配置文件

#基于那个配置文件BasedOnStyle: LLVM#指针的*的挨着哪边PointerAlignment: Right#缩进宽度IndentWidth: 4# 连续的空行保留几行MaxEmptyLinesToKeep: 1# 在 @property 后面添加空格, \@property (readonly) 而不是 \@property(readonly).ObjCSpaceAfterProperty: true# OC block后面的缩进ObjCBlockIndentWidth: 4# 是否允许短方法单行AllowShortFunctionsOnASingleLine: true# 是否允许短if单行 If true, if (a) return; 可以放到同一行AllowShortIfStatementsOnASingleLine: true#注释对齐AlignTrailingComments: true# 换行的时候对齐操作符#AlignOperands: true# 中括号两边空格 [] SpacesInSquareBrackets: true# 小括号两边添加空格SpacesInParentheses : false#多行声明语句按照=对齐AlignConsecutiveDeclarations: true#连续的赋值语句以 = 为中心对齐AlignConsecutiveAssignments: true#等号两边的空格SpaceBeforeAssignmentOperators: true# 容器类的空格 例如 OC的字典SpacesInContainerLiterals: true#缩进IndentWrappedFunctionNames: true#在block从空行开始KeepEmptyLinesAtTheStartOfBlocks: true#在构造函数初始化时按逗号断行,并以冒号对齐BreakConstructorInitializersBeforeComma: true#函数参数换行AllowAllParametersOfDeclarationOnNextLine: true#括号后添加空格SpaceAfterCStyleCast: true#tab键盘的宽度TabWidth: 4UseTab: Never

此时打开vim,退出编辑模式时会自动格式化代码

转载于:https://www.cnblogs.com/lepeCoder/p/8032178.html

你可能感兴趣的文章
JavaScript Number 对象 Javascript Array对象 Location 对象方法 String对象方法
查看>>
Python & Django 学习笔记
查看>>
python第四天练习题
查看>>
【bzoj4543】Hotel加强版(thr)
查看>>
没有标题(1)
查看>>
React-Native学习手册----搭建基于ios平台的开发环境
查看>>
Android手机 Fildder真机抓包
查看>>
[stm32] 中断
查看>>
L1-043 阅览室
查看>>
我大学时代的好朋友要结婚了!
查看>>
RTP Payload Format for Transport of MPEG-4 Elementary Streams over http
查看>>
PAT-1134. Vertex Cover (25)
查看>>
git 命令图解
查看>>
分布式存储系统可靠性系列三:设计模式
查看>>
this关键字的由来及使用
查看>>
两个时间相差多少 .net中的timespan应用
查看>>
递归 换零钱问题——由打靶子问题引申
查看>>
Python-函数基础
查看>>
Extensible Messaging and Presence Protocol (XMPP) 简介
查看>>
Farm Irrigation
查看>>