超詳細的Xcode代碼格式化教程,可自定義樣式。
當團隊內有多人開發的時候,每個人寫的代碼格式都有自己的喜好,也可能會忙着寫代碼而忽略了格式的問題。
在之前,我們可能會寫完代碼后,再一點一點去調格式,很浪費時間。
有了ClangFormat
插件后,就可以一鍵把代碼格式化成統一的樣式,不僅節省了時間,也使得代碼更規范。我們還可以定制自己喜歡的樣式。
安裝ClangFormat插件
可以手動安裝(下載GitHub項目編譯),也可以用Alcatraz(插件管理器)安裝,都很簡單,具體可以看我的文章《Xcode方便開發的插件推薦》。
裝好后是下圖這樣的,我們可以看到它內置了LLVM
、Google
、Chromium
、Mozilla
、WebKit
五種樣式。

使用方法
通過菜單可以看到,它可以格式化選中的文字們,或者格式化選擇的文件們。下面演示下LLVM
樣式下的格式化:

使用自定義樣式
1、需要先把上面菜單里面的File選中,因為我們需要讓它用我們自己寫的配置文件。

2、在工程目錄下創建配置文件.clang-format
文件並編輯。.clang-format
文件用的是YAML
格式:里面要用的字段在后面會詳細解釋。
key1: value1
# 一個注釋 key2: value2

當然如果你已經有.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
保存文件時就可以自動格式化了。

我們也可以給一些菜單設置快捷鍵,使用的時候不用每次去選擇各級菜單了。比如我們給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 (bool)
如果是true,把連續行的變量名對齊。默認為false。

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

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

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

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

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

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

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

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

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

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

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

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

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

當項目里面有多種語言時,我們可以分別設置樣式:
---
# 我們默認用 LLVM 樣式, 縮進寬度為4。 BasedOnStyle: LLVM IndentWidth: 4 --- Language: Cpp # C++ 設置星號左對齊。 PointerAlignment: Left --- Language: JavaScript # JavaScript 每行字符限制設置為100。 ColumnLimit: 100 --- Language: Proto # 不格式化Proto文件。 DisableFormat: true ...
這個是我在用的.clang-format文件。大家可以下載下來自己修改一下再用。
歡迎關注 我 和我的專題:iOS技術交流,查看更多好文章。
歡迎加入iOS技術交流群:244122891,這里有很多愛學習愛交流的人。
原文鏈接:http://www.jianshu.com/p/a725e24d7835
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。