vim代码格式化插件clang-format 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<std::string>)
⼀个宏,应解释为foreach循环⽽不是作为函数调⽤⽮量。
这些都是预期形式的宏:
FOREACH(<variable-declaration>, ...)
<loop-body>
在.clang-format 配置⽂件中, 这可以被设定为:
ForEachMacros: ['RANGES_FOR', 'FOREACH']
例如: BOOST_FOREACH.
IncludeCategories (std::vector<IncludeCategory>)
正则表达式表⽰不同的#include类别被⽤于#includes命令。
这些正则表达式与⼀个包含(包括< >或“)的⽂件的⽂件名相匹配。属于第⼀匹配正则表达式的值被分配,并且#include⾸先根据增加类别数然后在每个类别按字母的顺序排序。
如果正则表达式都不匹配,int_max分配类别。源⽂件的主要头引⽤⾃动获取类别0。因此,它通常是保持在#include开头(/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和de中的“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 缓冲 (le/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协议列表前添加⼀个空格,例如:使⽤<Protocol>⽽不是<Protocol>。
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的数组和字典字⾯量)。Spaces
InParentheses (bool)
如果为真(true), 将会在“(”之后和“)”之前插⼊空格。
SpacesInSquareBrackets (bool)
如果为真(true),将会在“[”之后和“]”之前插⼊空格。
Standard (LanguageStandard)
⽤这个标准格式化:例如:在LS_Cpp03中使⽤ A<A<int> > ⽽不是 A<A<int>>
可能的值有:
LS_Cpp03 (在配置中: Cpp03) 使⽤Use C++03统⼀语法。
LS_Cpp11 (在配置中: Cpp11) 使⽤C++11的特征(例如 A<A<int>>⽽不是A<A<int> >).
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
格式化命令format参数
# ⼩括号两边添加空格
SpacesInParentheses : false
#多⾏声明语句按照=对齐
AlignConsecutiveDeclarations: true
#连续的赋值语句以 = 为中⼼对齐
AlignConsecutiveAssignments: true
#等号两边的空格
SpaceBeforeAssignmentOperators: true
# 容器类的空格例如 OC的字典
SpacesInContainerLiterals: true
#缩进
IndentWrappedFunctionNames: true
#在block从空⾏开始
KeepEmptyLinesAtTheStartOfBlocks: true
#在构造函数初始化时按逗号断⾏,并以冒号对齐BreakConstructorInitializersBeforeComma: true
#函数参数换⾏
AllowAllParametersOfDeclarationOnNextLine: true
#括号后添加空格
SpaceAfterCStyleCast: true
#tab键盘的宽度
TabWidth: 4
UseTab: Never
此时打开vim,退出编辑模式时会⾃动格式化代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。