使用clang-format对iOS项目代码进行格式化

使用clang-format对iOS项目代码进行格式化

公司的项目已经迭代了近两年,在两年的时间里不断的有新人参加到项目里,每个人都有自己的代码风格,随着项目越来越大,没有统一代码规范带来的维护问题也越来越多,所以和小组的同事商量了下制定了iOS的编码规范。

规范总是要执行才能生效,不过几千字的编码规范总不能每次写代码前都熟读一遍吧,翻了下Package Manager,发现CLangFormat可以根据代码规范格式化代码。具体的使用方式已经有大神非常详尽地介绍,感兴趣的同学请移步《iOS 代码格式化管理》—Bannings的专栏。

看了《iOS 代码格式化管理》后发现我们当前还需要解决两个问题:一个是自定义符合我们团队的代码规范;另外一个是根据规范整理以前写的代码。

第一个问题 在《iOS 代码格式化管理》中已经介绍过,主要是配置.clang-format文件,让CLangFormat根据自定义的配置格式化代码,这里贴出我们团队使用的.clang-format配置。因为.clang-format的配置选项非常多、有些选项的解释非常模糊,所以我们只测试了常用的选项,没用到的都注释了。
$ cd /Users/xxxx/AppGo
$ vim .clang-fomat
$ open .clang-fomat

禁用当前format文件

DisableFormat: false

BasedOnStyle: WebKit

是否使用tab进行缩进

UseTab: Never
TabWidth: 4
IndentWidth: 4

语言

Language: Cpp
Standard: Cpp11

includeCategoriesStandard: Cpp11

Cpp11BracedListStyle: false

ForEachMacros

IncludeCategories

-----------------------file----------------------

最大宽度,如果代码超过这个宽度会按语义折行

ColumnLimit: 130

最多能超出ColumnLimit多少个字符

PenaltyExcessCharacter: 0

允许最大连续空行数

MaxEmptyLinesToKeep: 10

在续行(\

下一行)时的缩进长度

ContinuationIndentWidth: 4

CommentPragmas: ''

DerivePointerBinding: false

--------------------------code block------------------

括号的断行模式

BreakBeforeBraces: Mozilla

是否在容器字面量(@[@"1",@"2"])中插入空格

SpacesInContainerLiterals: true

case语句的位置总是在switch语句后缩进一级

IndentCaseLabels: true

多行赋值语句按=号对齐

AlignConsecutiveAssignments: false

多行声明语句按=号对齐

AlignConsecutiveDeclarations: false

是否把注释右对齐,下面为右对齐的效果

void someFunction() {

doWork(); // Does something

doMoreWork(); // Does something else

}

AlignTrailingComments: true

是否在括号前加上空格

SpaceBeforeParens: ControlStatements

在未封闭(括号的开始和结束不在同一行)的括号中的代码是否对齐

if(a &&

b)

AlignAfterOpenBracket: Align

类的访问修饰关键字(private,public,protected···)缩进

private:

int a;

1表示不缩进

大于1的值表示访问修饰关键字的左侧从int a的左侧列开始往右侧移动的距离

AccessModifierOffset: 1

在构造函数初始化时按逗号断行,并以冒号对齐

BreakConstructorInitializersBeforeComma: false

ConstructorInitializerAllOnOneLineOrOnePerLine: false

ConstructorInitializerIndentWidth: 0

ExperimentalAutoDetectBinPacking: false

IndentWrappedFunctionNames: true

IndentFunctionDeclarationAfterType: false

AlignEscapedNewlinesLeft: true

BinPackArguments: false

BinPackParameters: false

AllowAllParametersOfDeclarationOnNextLine: false

----------------------sataement----------------

指针在类型那边还是在变量名那边还是在中间

PointerAlignment: Right

在=号前加空格

SpaceBeforeAssignmentOperators: true

是否在空括号中加空格

SpaceInEmptyParentheses: false

单行注释前的空格数

SpacesBeforeTrailingComments: 0

是否在<>中间插入空格

SpacesInAngles: false

是否在非空的括号中插入空格

SpacesInParentheses: false

在三元运算符前断行

BreakBeforeTernaryOperators: true

在二元运算符前断行

BreakBeforeBinaryOperators: All

是否允许短代码块在一行写完

如 if (a) { return; }

AllowShortBlocksOnASingleLine: false

是否允许短switch的case 语句在一行写完

AllowShortCaseLabelsOnASingleLine: true

是否允许短的函数在一行写完

AllowShortFunctionsOnASingleLine: false

是否允许短的语句在一行写完

AllowShortIfStatementsOnASingleLine: true

是否允许短的循环在一行写完

AllowShortLoopsOnASingleLine: true

命名空间缩进

NamespaceIndentation: All

AlignOperands: false

PenaltyBreakBeforeFirstCallParameter: 100

PenaltyBreakComment: 100

PenaltyBreakFirstLessLess: 0

PenaltyBreakString: 100

-----------------------------OC only---------------------

block开始的正则

MacroBlockBegin: ''

block开始的正则

MacroBlockEnd: ''

在block从空行开始

KeepEmptyLinesAtTheStartOfBlocks: true

block内的缩进

ObjCBlockIndentWidth: 4

是否需要在"@property"后加上空格

ObjCSpaceAfterProperty: true

是否需要在协议名后加上空格

ObjCSpaceBeforeProtocolList: true

----------------------------other-------------------

AlwaysBreakAfterDefinitionReturnType

AlwaysBreakAfterReturnType

AlwaysBreakBeforeMultilineStrings: false

AlwaysBreakTemplateDeclarations: false

PenaltyReturnTypeOnItsOwnLine: 20

PointerBindsToType: 100

SpacesInCStyleCastParentheses: false

第二个问题 其实也很简单,CLangFormat就是把clang-format进行了wrap,clang-format本身其实是一个命令行工具,所以嘛,写个shell脚本就能把以前代码都格式化了。具体的命令如下:

find . -regex “..[hm]” | xargs clang-format -i -style=file
把上面的命令解释下,这行命令分为3部分:
1 find . -regex ".
.[hm]"是找出当前目录所在的所有以h和m结尾的文件
2 | xargs把文件导入到xargs中,逐个调用clang-format命令
3 clang-format -i -style=file 这里就是对文件进行格式化了,-i的意思是把格式化好的代码直接写入源文件,-sytle=file指从当前目录或者当前父目录搜索文件名为.clang-format的格式配置文件

当然,这行命令需要你根据你自己的clang-format的路径做一下调整。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 前言 每次在写代码写完一行或一个文件时,都要为了一些缩进、代码不整齐、空行太多等等,对于此现象,有的开发人员是避之...
    Colin_狂奔的蚂蚁阅读 25,124评论 3 8
  • 前言 众所周知,程序员们的代码风格因人而异,好在有自动规范代码格式工具可以帮助解决代码风格迥异的问题。结合同事的推...
    who_young阅读 3,733评论 5 3
  • 感赏儿子昨天下午打电话给爸爸说回出租屋休息一下,心情很好。(星期三是家长开放日,放学比平时早,儿子学校是全寄宿制)...
    坚持的玲儿阅读 105评论 4 2
  • 今天是妇女节,女性们都愿过这个节,却在极力避免“三八”、“妇女”这样的字眼,今年又出现个新词,叫“女神节”,听着顺...
    碧云天天阅读 173评论 0 0