1. 程式人生 > >vim代碼格式化插件clang-format

vim代碼格式化插件clang-format

modifier ner 鍵盤 構造函數初始化列表 include 頂級 exp 制表位 解釋


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

vim代碼格式化插件clang-format