×

用clang-format 给代码美容

96
HollyHigh
2017.05.23 17:15 字数 112

clang-format

clang-format是llvm clang toolchains里面的一个代码格式化工具,一般与clang安装在同样的路径下,
当然,如果想从源码编译出clang-format,clang-format在clang源码的tools路径下。一般与clang一起编译。

llvm-source
  \-tools
    \-clang
      \-tools
        \-clang-format

clang-format使用方法

$> clang-format --help // 显示帮助信息
// 导出Google风格的格式化信息
// 后续使用的时候,指定-style=file,clang-format会在父目录自动查找.clang-format文件,
// 所以,将.clang-format扔在${HOME}目录下即可
$> clang-format -style=Google -dump-config > ${HOME}/.clang-format     
// 使用刚才生成的.clang-format格式化xxx.cpp, -i参数直接修改原文件,否则输出到标准输出(stdout)
$> clang-format -style=file -i ./xxx.cpp

Google style dump-config分析优化

---
Language:        Cpp
# BasedOnStyle:  Google

# 完全禁用格式化
DisableFormat:   false
# 类作用域相对类中成员的起始位置
AccessModifierOffset: -2
# ##说明文档中未找到说明
IndentFunctionDeclarationAfterType: false
# 起始括号后面的内容是否对齐,以及对齐方式
# Align、DontAlign、AlwaysBreak
AlignAfterOpenBracket: Align
# 连续赋值是否按照=(等号)对齐
#     int aaaa = 12;
#    int b    = 23;
#    int ccc  = 23;
AlignConsecutiveAssignments: false
# 连续赋值,是否按照变量名对齐
#     int         aaaa = 12;  
#    float       b = 23;
#    std::string ccc = 23;
AlignConsecutiveDeclarations: false
# 回车折行的新航,尽量靠左对齐
AlignEscapedNewlinesLeft: true
# 是否允许函数声明的参数都独占一行(感觉优先级比较低,尝试未发现效果)
AllowAllParametersOfDeclarationOnNextLine: true
# 运算符操作数对齐,尤其是需要折行的情况下(总长度大于允许的单行字符数时)
AlignOperands:   true
# 行尾注释对齐
AlignTrailingComments: true
# 允许短代码块单行
AllowShortBlocksOnASingleLine: false
# 允许短的switch case中的case标签单行
AllowShortCaseLabelsOnASingleLine: false
# 允许短函单行
AllowShortFunctionsOnASingleLine: All
# 允许短的if语句单行
AllowShortIfStatementsOnASingleLine: true
# 允许短的循环单行
AllowShortLoopsOnASingleLine: true
# 函数定义处,是否允许返回值后折行
# None、All、TopLevel
AlwaysBreakAfterDefinitionReturnType: None
# 函数返回值后是否换行
# None、All、TopLevel、AllDefinitions、TopLevelDefinitions
AlwaysBreakAfterReturnType: None
# 多行字符串的对齐方式
AlwaysBreakBeforeMultilineStrings: true
# 当true时,template<...>后换行
AlwaysBreakTemplateDeclarations: true
# 当为false时,一个函数调用的所有参数,如果在
# 单行长度之内,就都在一行显示,如果超出一行了,则
# 每个参数独占一行
BinPackArguments: false
# 当为false时,一个函数生命的参数,要么都在一行,
# 要么每个参数独占一行
BinPackParameters: false
# 括号的折行方式,当为Custom时,
# 根据BraceWrapping的子项目来设置
BreakBeforeBraces: Custom
# 括号的展示方式,当BreakBeforeBraces 为Custom时
# 此参数起作用,否则被忽略
BraceWrapping:   
  AfterClass:      false
  AfterControlStatement: false
  AfterEnum:       false
  AfterFunction:   false
  AfterNamespace:  false
  AfterObjCDeclaration: false
  AfterStruct:     false
  AfterUnion:      false
  BeforeCatch:     false
  BeforeElse:      false
  IndentBraces:    false
# 二元运算符之前换行还是之后换行(即新行以运算符开始还是操作数开始)
# None、NonAssignment、All
BreakBeforeBinaryOperators: None
# 括号和其内容的关联方式
# 即,括号依附之前内容、还是独占一行显示
BreakBeforeBraces: Attach
# #没发现true和false的区别
BreakBeforeTernaryOperators: true
# 构造函数的初始化列表格式,是否每个成员函数的初始化独占一行
# constructor(int m, int n): _m(m), _n(n){}
# constructor(int m, int n)
#    : _m(m)
#    , _n(n) {}
BreakConstructorInitializersBeforeComma: false
BreakAfterJavaFieldAnnotations: false
# 是否允许过长的字符串拆分折行
# s = "abcd"
# s = "ab"
#      "cd"
BreakStringLiterals: true
# 单行最大字符数
ColumnLimit:     80
# 符合正则的注释不会被拆分成多行,或者修改
CommentPragmas:  '^ IWYU pragma:'
# 构造函数初始化列表参数,全都在一行,或者每个参数独占一行
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# 构造函数初始化列表缩进
ConstructorInitializerIndentWidth: 4
# 续行的缩进 
ContinuationIndentWidth: 4
# 
Cpp11BracedListStyle: true
# 作为后备选项,分析整个文件的& 和 *的对齐方式
# 会影响PointerAlignment的设置
#DerivePointerAlignment: true
# 由clang-format来决定如何格式化参数,试验性属性,不建议为true
ExperimentalAutoDetectBinPacking: false
# for_each的格式化方式
ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
# 按照优先级重新排列头文件的引入
IncludeCategories: 
  - Regex:           '^<.*\.h>'
    Priority:        1
  - Regex:           '^<.*'
    Priority:        2
  - Regex:           '.*'
    Priority:        3
IncludeIsMainRegex: '([-_](test|unittest))?$'
# 相对于switch,case缩进还是和switch同级
IndentCaseLabels: true
# 缩进
IndentWidth:     4

IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptyLinesToKeep: 1
# 命名空间缩进规则
# None、Inner、All
NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: false
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
# 指针靠近类型还是变量
# Left、Right、Middle
PointerAlignment: Right
# 重排注释
ReflowComments:  true
# 对头文件包含部分进行排序
# 当为true时,将根据IncludeCategories中的顺序排序
SortIncludes:    true
# 当为true时,或许会在cstyle的类型转换中插入空格
SpaceAfterCStyleCast: false
# 在template关键字后插入空格
SpaceAfterTemplateKeyword: true
# 在赋值操作符前插入空格
SpaceBeforeAssignmentOperators: true
# 在小括号前插入空格
# Never、ControlStatements(if/while/for)、Always
SpaceBeforeParens: ControlStatements
# 在空小括号中插入空格
SpaceInEmptyParentheses: false
# 行尾注释与代码间隔
SpacesBeforeTrailingComments: 2
# 在尖括号中插入空格
SpacesInAngles:  false
SpacesInContainerLiterals: true
# 当为true时,C类型的转换可能被插入空格
SpacesInCStyleCastParentheses: false
# 在小括号中内容前后添加空格
SpacesInParentheses: false
# 在方括号中内容前后添加空格
SpacesInSquareBrackets: false
Standard:        Auto
# tab 宽度
TabWidth:        4
# tab的使用方式
# Never、ForIndentation、Always
UseTab:          Never
...

参考

http://releases.llvm.org/4.0.0/tools/clang/docs/ClangFormat.html
http://releases.llvm.org/4.0.0/tools/clang/docs/ClangFormatStyleOptions.html

Web note ad 1