使用clang-format對(duì)iOS項(xiàng)目代碼進(jìn)行格式化

使用clang-format對(duì)iOS項(xiàng)目代碼進(jìn)行格式化

公司的項(xiàng)目已經(jīng)迭代了近兩年,在兩年的時(shí)間里不斷的有新人參加到項(xiàng)目里菠隆,每個(gè)人都有自己的代碼風(fēng)格,隨著項(xiàng)目越來(lái)越大,沒(méi)有統(tǒng)一代碼規(guī)范帶來(lái)的維護(hù)問(wèn)題也越來(lái)越多宾舅,所以和小組的同事商量了下制定了iOS的編碼規(guī)范敬尺。

規(guī)范總是要執(zhí)行才能生效,不過(guò)幾千字的編碼規(guī)范總不能每次寫代碼前都熟讀一遍吧贴浙,翻了下Package Manager砂吞,發(fā)現(xiàn)CLangFormat可以根據(jù)代碼規(guī)范格式化代碼。具體的使用方式已經(jīng)有大神非常詳盡地介紹崎溃,感興趣的同學(xué)請(qǐng)移步《iOS 代碼格式化管理》—Bannings的專欄蜻直。

看了《iOS 代碼格式化管理》后發(fā)現(xiàn)我們當(dāng)前還需要解決兩個(gè)問(wèn)題:一個(gè)是自定義符合我們團(tuán)隊(duì)的代碼規(guī)范;另外一個(gè)是根據(jù)規(guī)范整理以前寫的代碼袁串。

第一個(gè)問(wèn)題 在《iOS 代碼格式化管理》中已經(jīng)介紹過(guò)概而,主要是配置.clang-format文件,讓CLangFormat根據(jù)自定義的配置格式化代碼囱修,這里貼出我們團(tuán)隊(duì)使用的.clang-format配置赎瑰。因?yàn)?clang-format的配置選項(xiàng)非常多、有些選項(xiàng)的解釋非常模糊破镰,所以我們只測(cè)試了常用的選項(xiàng)餐曼,沒(méi)用到的都注釋了。
$ cd /Users/xxxx/AppGo
$ vim .clang-fomat
$ open .clang-fomat

禁用當(dāng)前format文件

DisableFormat: false

BasedOnStyle: WebKit

是否使用tab進(jìn)行縮進(jìn)

UseTab: Never
TabWidth: 4
IndentWidth: 4

語(yǔ)言

Language: Cpp
Standard: Cpp11

includeCategoriesStandard: Cpp11

Cpp11BracedListStyle: false

ForEachMacros

IncludeCategories

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

最大寬度,如果代碼超過(guò)這個(gè)寬度會(huì)按語(yǔ)義折行

ColumnLimit: 130

最多能超出ColumnLimit多少個(gè)字符

PenaltyExcessCharacter: 0

允許最大連續(xù)空行數(shù)

MaxEmptyLinesToKeep: 10

在續(xù)行(\

下一行)時(shí)的縮進(jìn)長(zhǎng)度

ContinuationIndentWidth: 4

CommentPragmas: ''

DerivePointerBinding: false

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

括號(hào)的斷行模式

BreakBeforeBraces: Mozilla

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

SpacesInContainerLiterals: true

case語(yǔ)句的位置總是在switch語(yǔ)句后縮進(jìn)一級(jí)

IndentCaseLabels: true

多行賦值語(yǔ)句按=號(hào)對(duì)齊

AlignConsecutiveAssignments: false

多行聲明語(yǔ)句按=號(hào)對(duì)齊

AlignConsecutiveDeclarations: false

是否把注釋右對(duì)齊,下面為右對(duì)齊的效果

void someFunction() {

doWork(); // Does something

doMoreWork(); // Does something else

}

AlignTrailingComments: true

是否在括號(hào)前加上空格

SpaceBeforeParens: ControlStatements

在未封閉(括號(hào)的開(kāi)始和結(jié)束不在同一行)的括號(hào)中的代碼是否對(duì)齊

if(a &&

b)

AlignAfterOpenBracket: Align

類的訪問(wèn)修飾關(guān)鍵字(private,public,protected···)縮進(jìn)

private:

int a;

1表示不縮進(jìn)

大于1的值表示訪問(wèn)修飾關(guān)鍵字的左側(cè)從int a的左側(cè)列開(kāi)始往右側(cè)移動(dòng)的距離

AccessModifierOffset: 1

在構(gòu)造函數(shù)初始化時(shí)按逗號(hào)斷行鲜漩,并以冒號(hào)對(duì)齊

BreakConstructorInitializersBeforeComma: false

ConstructorInitializerAllOnOneLineOrOnePerLine: false

ConstructorInitializerIndentWidth: 0

ExperimentalAutoDetectBinPacking: false

IndentWrappedFunctionNames: true

IndentFunctionDeclarationAfterType: false

AlignEscapedNewlinesLeft: true

BinPackArguments: false

BinPackParameters: false

AllowAllParametersOfDeclarationOnNextLine: false

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

指針在類型那邊還是在變量名那邊還是在中間

PointerAlignment: Right

在=號(hào)前加空格

SpaceBeforeAssignmentOperators: true

是否在空括號(hào)中加空格

SpaceInEmptyParentheses: false

單行注釋前的空格數(shù)

SpacesBeforeTrailingComments: 0

是否在<>中間插入空格

SpacesInAngles: false

是否在非空的括號(hào)中插入空格

SpacesInParentheses: false

在三元運(yùn)算符前斷行

BreakBeforeTernaryOperators: true

在二元運(yùn)算符前斷行

BreakBeforeBinaryOperators: All

是否允許短代碼塊在一行寫完

如 if (a) { return; }

AllowShortBlocksOnASingleLine: false

是否允許短switch的case 語(yǔ)句在一行寫完

AllowShortCaseLabelsOnASingleLine: true

是否允許短的函數(shù)在一行寫完

AllowShortFunctionsOnASingleLine: false

是否允許短的語(yǔ)句在一行寫完

AllowShortIfStatementsOnASingleLine: true

是否允許短的循環(huán)在一行寫完

AllowShortLoopsOnASingleLine: true

命名空間縮進(jìn)

NamespaceIndentation: All

AlignOperands: false

PenaltyBreakBeforeFirstCallParameter: 100

PenaltyBreakComment: 100

PenaltyBreakFirstLessLess: 0

PenaltyBreakString: 100

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

block開(kāi)始的正則

MacroBlockBegin: ''

block開(kāi)始的正則

MacroBlockEnd: ''

在block從空行開(kāi)始

KeepEmptyLinesAtTheStartOfBlocks: true

block內(nèi)的縮進(jìn)

ObjCBlockIndentWidth: 4

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

ObjCSpaceAfterProperty: true

是否需要在協(xié)議名后加上空格

ObjCSpaceBeforeProtocolList: true

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

AlwaysBreakAfterDefinitionReturnType

AlwaysBreakAfterReturnType

AlwaysBreakBeforeMultilineStrings: false

AlwaysBreakTemplateDeclarations: false

PenaltyReturnTypeOnItsOwnLine: 20

PointerBindsToType: 100

SpacesInCStyleCastParentheses: false

第二個(gè)問(wèn)題 其實(shí)也很簡(jiǎn)單源譬,CLangFormat就是把clang-format進(jìn)行了wrap,clang-format本身其實(shí)是一個(gè)命令行工具孕似,所以嘛踩娘,寫個(gè)shell腳本就能把以前代碼都格式化了。具體的命令如下:

find . -regex “..[hm]” | xargs clang-format -i -style=file
把上面的命令解釋下喉祭,這行命令分為3部分:
1 find . -regex ".
.[hm]"是找出當(dāng)前目錄所在的所有以h和m結(jié)尾的文件
2 | xargs把文件導(dǎo)入到xargs中养渴,逐個(gè)調(diào)用clang-format命令
3 clang-format -i -style=file 這里就是對(duì)文件進(jìn)行格式化了,-i的意思是把格式化好的代碼直接寫入源文件泛烙,-sytle=file指從當(dāng)前目錄或者當(dāng)前父目錄搜索文件名為.clang-format的格式配置文件

當(dāng)然理卑,這行命令需要你根據(jù)你自己的clang-format的路徑做一下調(diào)整。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胶惰,一起剝皮案震驚了整個(gè)濱河市傻工,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孵滞,老刑警劉巖中捆,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坊饶,居然都是意外死亡泄伪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門匿级,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蟋滴,“玉大人染厅,你說(shuō)我怎么就攤上這事〗蚝” “怎么了肖粮?”我有些...
    開(kāi)封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尔苦。 經(jīng)常有香客問(wèn)我涩馆,道長(zhǎng),這世上最難降的妖魔是什么允坚? 我笑而不...
    開(kāi)封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任魂那,我火速辦了婚禮,結(jié)果婚禮上稠项,老公的妹妹穿的比我還像新娘涯雅。我一直安慰自己,他們只是感情好展运,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布活逆。 她就那樣靜靜地躺著,像睡著了一般乐疆。 火紅的嫁衣襯著肌膚如雪划乖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天挤土,我揣著相機(jī)與錄音,去河邊找鬼误算。 笑死仰美,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的儿礼。 我是一名探鬼主播咖杂,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚊夫!你這毒婦竟也來(lái)了诉字?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤知纷,失蹤者是張志新(化名)和其女友劉穎壤圃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琅轧,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伍绳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乍桂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冲杀。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡效床,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出权谁,到底是詐尸還是另有隱情剩檀,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布旺芽,位于F島的核電站沪猴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏甥绿。R本人自食惡果不足惜字币,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望共缕。 院中可真熱鬧洗出,春花似錦、人聲如沸图谷。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)便贵。三九已至菠镇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間承璃,已是汗流浹背利耍。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盔粹,地道東北人隘梨。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舷嗡,于是被迫代替她去往敵國(guó)和親轴猎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理进萄,服務(wù)發(fā)現(xiàn)捻脖,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 前言 每次在寫代碼寫完一行或一個(gè)文件時(shí)中鼠,都要為了一些縮進(jìn)可婶、代碼不整齊、空行太多等等兜蠕,對(duì)于此現(xiàn)象扰肌,有的開(kāi)發(fā)人員是避之...
    Colin_狂奔的螞蟻閱讀 25,194評(píng)論 3 8
  • 前言 眾所周知,程序員們的代碼風(fēng)格因人而異熊杨,好在有自動(dòng)規(guī)范代碼格式工具可以幫助解決代碼風(fēng)格迥異的問(wèn)題曙旭。結(jié)合同事的推...
    who_young閱讀 3,762評(píng)論 5 3
  • 感賞兒子昨天下午打電話給爸爸說(shuō)回出租屋休息一下盗舰,心情很好。(星期三是家長(zhǎng)開(kāi)放日桂躏,放學(xué)比平時(shí)早钻趋,兒子學(xué)校是全寄宿制)...
    堅(jiān)持的玲兒閱讀 107評(píng)論 4 2
  • 今天是婦女節(jié),女性們都愿過(guò)這個(gè)節(jié)剂习,卻在極力避免“三八”蛮位、“婦女”這樣的字眼,今年又出現(xiàn)個(gè)新詞鳞绕,叫“女神節(jié)”失仁,聽(tīng)著順...
    碧云天天閱讀 174評(píng)論 0 0