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,退出編輯模式時會自動格式化代碼