1. 程式人生 > >Xcode程式碼格式化教程

Xcode程式碼格式化教程

為什麼要格式化程式碼

當團隊內有多人開發的時候,每個人寫的程式碼格式都有自己的喜好,也可能會忙著寫程式碼而忽略了格式的問題。
在之前,我們可能會寫完程式碼後,再一點一點去調格式,很浪費時間。

有了ClangFormat外掛後,就可以一鍵把程式碼格式化成統一的樣式,不僅節省了時間,也使得程式碼更規範。我們還可以定製自己喜歡的樣式。

安裝ClangFormat外掛

裝好後是下圖這樣的,我們可以看到它內建了LLVMGoogleChromiumMozillaWebKit五種樣式。


外掛選單

使用方法

通過選單可以看到,它可以格式化選中的文字們,或者格式化選擇的檔案們。下面演示下LLVM樣式下的格式化:


LLVM樣式下的格式化

使用自定義樣式

1、需要先把上面選單裡面的File選中,因為我們需要讓它用我們自己寫的配置檔案。


選中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儲存檔案時就可以自動格式化了。


螢幕快照 2016-09-10 下午12.43.50.png

我們也可以給一些選單設定快捷鍵,使用的時候不用每次去選擇各級選單了。比如我們給Format Selected Text設定快捷鍵:


設定格式化快捷鍵

你也可以為其他選單設定快捷鍵,其實呢,我用Format Selected Text的時候很少,每次都是想格式化的時候直接⌘+S就行了哈哈哈。

配置檔案中屬性的含義講解

下面說一些配置檔案的常用的引數介紹,其他的可以看官方文件:Clang-Format Style Options,其中小括號內代表他需的是什麼型別的值。

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

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)
@[]裡面,是否在 [ 後和 ] 前加空格。預設為true。


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
...

參考:http://www.jianshu.com/p/16723f707bd5