vim代碼格式化插件clang-format
阿新 • • 發佈:2017-12-13
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