vim代码格式化插件clang-format



title: vim代码格式化插件clang-format
date: 2017-12-12 20:28:26
tags: vim
categories: 开发工具


安装vim-clang-format插件

项目地址:
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开头(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协议列表前添加一个空格, 例如: 使用<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的数组和字典字面量)。

SpacesInParentheses (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
# 小括号两边添加空格
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,退出编辑模式时会自动格式化代码

时间: 2024-08-19 13:55:40

vim代码格式化插件clang-format的相关文章

Notepad++代码格式化插件的下载与安装

notepad++是一个功能强大的文本编辑工具,免费.开源.速度快是它的优点,它是UltraEditor, emEditor, EditorPlus等收费工具的绝佳替代器. NppAStyle是一个NotePad++的插件,用于格式化Notepad中编辑的c.c++.C#.java代码.NppAStyle在内部使用Astyle来格式化代码,是一个很简单,但很实用的Notepad++插件. Notepad++的SourceForge的Plugins主页? ? 获取插件 Notepad++点击菜单栏

iOS 代码格式化插件Clang-Format

参考:http://blog.csdn.net/zhangao0086/article/details/42872263 最近笔者在接手同事的项目,发现项目经过多人手后,每人个的代码格式风格又有点差异导致代码显示很乱,Google了一番,发现有一个iOS代码格式插件Clang-Format,相当的给力. 配置CLangFormat 虽然CLangFormat本身就内置了一些标准化的代码格式化方案,但是同样可以自定义,我们就采用了自定义的方法. 具体的,在工程目录或者workspace目录下创建一

Notepad++ 代码格式化插件

UniversalIndentGUI 是一个代码格式化工具合集,基于很多开源的代码格式化项目.有NPP的插件版也有独立的程序,支持常见代码格式. 支持的代码格式: C, C++, C#, Cobol, CSS, D, Fortran, HTML, JAVA, Javascript, JSP, Objective-C, Pawn, Perl, PHP, Python, Ruby, Shellscript, VALA, XML and XSL 插件版的链接:(打开后查找UniversalIndent

VIM 代码片段插件 ultisnips 使用教程

博客原文 安装 Ultisnips 插件安装分两部分,一个是 ultisnips 插件本身,另外一个是代码片段仓库.一般来说把默认的代码片段仓库下载下来按需修改后上传到自己的 github 即可.如果你和我一样也使用 vim-plug 来管理插件的话,添加下面的代码到你的 vimrc 中保存刷新即可 Plug 'SirVer/ultisnips' " 你自己的代码仓库 git 地址 Plug 'keelii/vim-snippets' 上面的示例中所有的代码片段都存放在插件安装目录下面的 vim

Sublime text3 代码格式化插件安装

1. 打开菜单 -> 首选项(Perferences) -> 插件控制(Packpage Control),输入"Install Package" 2. 等待程序进入插件管理功能,再输入插件名称:"HTML-CSS-JS prettify" 3. 点击安装插件 "HTML-CSS-JS Prettify" . 4. 插件安装成功后,在需要格式化的HTML代码中,选中代码,然后按 "Ctrl+Alt+H" 对代码进行

vim代码片段插件ultisnips的使用

ultisnips是一个可以自动进行代码补全的插件,可以通过Vundle进行安装,要启用ultisnips,首先可以下面的配置信息写入到~/.vimrc " Track the engine. Plugin 'SirVer/ultisnips' " Snippets are separated from the engine. Add this if you want them: Plugin 'honza/vim-snippets' " Trigger configurat

Sublime Text 3 代码格式化插件推荐 CodeFormatter

CodeFormatter CodeFormatter has support for the following languages: * PHP - By PHP_Beautifier* JavaScript/JSON - By JSBeautifier* HTML - By JSBeautifier* CSS - By JSBeautifier* Python - By PythonTidy (only ST2) 支持,php,js,html,css 默认快捷键 ctrl+shift+f;

Visual Studio 代码格式化插件(等号自动对齐、注释自动对齐等)

1.下载地址 插件:Code alignment  下载地址 2.介绍 Based on principles borrowed from mathematics and other disciplines, code alignment gives extra meaning to your code by lining up similar data in columns. This is something we do naturally when working with tables

Sublime Text 3 的HTML代码格式化插件Tag

安装: 1.按Ctrl+Shift+P调出命令面板 2.输入 ip 调出 Package Control: Install Package 选项,按下回车后接着输入“Tag”,再次按回车等待安装完成并重启. 使用: 选中一段html代码,按Ctrl+Alt+f即可.