超詳細的Xcode代碼格式化教程,可自定義樣式。
為什么要格式化代碼
當團隊內有多人開發的時候,每個人寫的代碼格式都有自己的喜好,也可能會忙著寫代碼而忽略了格式的問題。
在之前,我們可能會寫完代碼后,再一點一點去調格式,很浪費時間。
有了 ClangFormat 插件后,就可以一鍵把代碼格式化成統一的樣式,不僅節省了時間,也使得代碼更規范。我們還可以定制自己喜歡的樣式。
安裝ClangFormat插件
可以手動安裝(下載 GitHub項目 編譯),也可以用 Alcatraz (插件管理器)安裝,都很簡單,具體可以看我的文章 《Xcode方便開發的插件推薦》 。
裝好后是下圖這樣的,我們可以看到它內置了 LLVM 、 Google 、 Chromium 、 Mozilla 、 WebKit 五種樣式。
插件菜單
使用方法
通過菜單可以看到,它可以格式化選中的文字們,或者格式化選擇的文件們。下面演示下 LLVM 樣式下的格式化:
LLVM樣式下的格式化
使用自定義樣式
1、需要先把上面菜單里面的File選中,因為我們需要讓它用我們自己寫的配置文件。
選中File
2、在工程目錄下創建配置文件 .clang-format 文件并編輯。 .clang-format 文件用的是 YAML 格式:里面要用的字段在后面會詳細解釋。
key1: value1
一個注釋
key2: value2</code></pre>

自定義樣式格式化代碼
當然如果你已經有 .clang-format 文件的話,直接拖動到項目根目錄也可以。
文章結尾有我在用的 .clang-format 文件。
溫馨提示: .clang-format 文件是隱藏文件,默認是看不見的。需要在終端輸入以下命令:
//顯示 隱藏文件
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder
//隱藏 隱藏文件
defaults write com.apple.finder AppleShowAllFiles -bool false
killall Finder
全局配置
上面我們是在項目根目錄創建的 .clang-format 文件,每次建新項目都要有。如果你想讓所有的項目公用一個文件,把 .clang-format 文件放在所有項目都在的一個最大根目錄下就可以了。
讓一段代碼不受格式化影響
如果想讓一段代碼不受格式化影響,需要將他們包含在 // clang-format off 和 // clang-format on 這兩句注釋之間,這樣這段代碼就不會被格式化,但是這兩句注釋本身是會被格式化的。

讓一段代碼不受格式化影響
設置快捷鍵
首先你可以選中菜單中的 Enable Format On Sava ,把它點 Disable Format On Sava ,這樣以后每次按 ?+S 保存文件時就可以自動格式化了。

屏幕快照 2016-09-10 下午12.43.50.png
我們也可以給一些菜單設置快捷鍵,使用的時候不用每次去選擇各級菜單了。比如我們給 Format Selected Text 設置快捷鍵:

設置格式化快捷鍵
你也可以為其他菜單設置快捷鍵,其實呢,我用 Format Selected Text 的時候很少,每次都是想格式化的時候直接 ?+S 就行了哈哈哈。
配置文件中屬性的含義講解
下面說一些配置文件的常用的參數介紹,其他的可以看官方文檔: Clang-Format Style Options ,其中小括號內代表他需的是什么類型的值。
BasedOnStyle(string)
基于哪種樣式。除了文件中寫出的定制屬性外,別的沒定制的屬性都默認用這種樣式的。
可選值有五種:
LLVM :一種遵循 LLVM coding standards 的樣式。
Google :一種遵循 Google’s C++ style guide 的樣式。
Chromium :一種遵循 Chromium’s style guide 的樣式。
Mozilla :一種遵循 Mozilla’s style guide 的樣式。
WebKit :一種遵循 WebKit’s style guide 的樣式。
AccessModifierOffset(int)
訪問修飾詞 (比如public) 前面額外需要加的縮進長度。默認為0。
AlignConsecutiveAssignments(bool)
如果是true,把連續的賦值操作按=對齊,默認為false。

AlignConsecutiveDeclarations-true
AlignConsecutiveDeclarations(bool)
如果是true,把連續行的變量名對齊。默認為false。

AlignConsecutiveDeclarations-true
AlignTrailingComments(bool)
如果是true,對齊尾部注釋。默認為false。

AlignTrailingComments-true
AllowShortCaseLabelsOnASingleLine(bool)
如果是true, 允許一個case在一行寫完,默認為false。

AllowShortCaseLabelsOnASingleLine-true
BreakBeforeBraces(string)
大括號前面是否換行,具體可選值看文檔。一般用Allman,代表所有大括號都換行。

BreakBeforeBraces-Allman
ColumnLimit(unsigned)
每行最多多少個字符,0不限制
IndentWidth(unsigned)
縮進寬度,默認為2,但是我們一般設置為4。

IndentWidth-4
IndentCaseLabels(bool)
switch的case縮進寬度,一般用true。默認為false,case會和switch對齊。
KeepEmptyLinesAtTheStartOfBlocks(bool)
是否保留block里面開始的空行們。默認為true。

KeepEmptyLinesAtTheStartOfBlocks-true
MaxEmptyLinesToKeep(unsigned)
最多可以有連續幾行空行,默認為1。

MaxEmptyLinesToKeep-1
ObjCBlockIndentWidth
OC的block里面的縮進寬度,默認為4。
ObjCSpaceAfterProperty(bool)
OC里面,是否在@property后加空格。默認為false。

ObjCSpaceAfterProperty-true
ObjCSpaceBeforeProtocolList(bool)
OC里面,是否在Protocol名字列表前面加空格,默認為true。

ObjCSpaceBeforeProtocolList-true
PointerAlignment(string)
指針的位置。默認為Right。
可選值:
Left: NSString name
Middle: NSString name
Right: NSString *name</code></pre>
SpaceBeforeAssignmentOperators(bool)
= 前面是否有空格。默認為true。
SpaceBeforeParens(string)
是否在 ( 前面加空格。默認ControlStatements。
可選值:
Never: 從來不在 ( 前面加空格。
ControlStatements:在控制語句(for/if/while...)的 ( 前面加空格。
Always:總會在 ( 前面加空格。

SpaceBeforeParens-ControlStatements
SpaceInEmptyParentheses(bool)
是否在 () 里面插入一個空格。默認false。
SpacesBeforeTrailingComments(unsigned)
在尾部//注釋前面加幾個空格。

SpacesBeforeTrailingComments-3
SpacesInAngles(bool)
是否在 < 后邊和 > 前邊插入空格,默認為false。

SpacesInAngles-true
SpacesInContainerLiterals(bool)
<p>@[] 里面,是否在 [ 后和 ] 前加空格。默認為true。</p>

SpacesInContainerLiterals-true
SpacesInParentheses(bool)
是否在 ( 后面和 ) 前面加空格,默認為false。

SpacesInParentheses-true
當項目里面有多種語言時,我們可以分別設置樣式:
---
我們默認用 LLVM 樣式, 縮進寬度為4。
BasedOnStyle: LLVM
IndentWidth: 4
Language: Cpp
C++ 設置星號左對齊。
PointerAlignment: Left
Language: JavaScript
JavaScript 每行字符限制設置為100。
ColumnLimit: 100
Language: Proto
不格式化Proto文件。
DisableFormat: true
...</code></pre>
來自:http://www.jianshu.com/p/a725e24d7835