title: vim代碼格式化插件clang-format
date: 2017-12-12 20:28:26
tags: vim
categories: 開發工具html
項目地址:
vim-clang-formatjava
若是用Vundle管理vim插件,直接在.vimrc
中添加一行c++
Plugin 'vim-clang-format'
運行:PluginInstall
就能夠自動安裝插件git
"配置 let g:clang_format#auto_format_on_insert_leave=1 "退出插入模式時自動格式化
支持的語言github
須要事先安裝clang-format正則表達式
$ pacman -S clang-format
配置信息json
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
vim
個人配置文件數組
#基於那個配置文件 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,退出編輯模式時會自動格式化代碼bash