Xcode程式碼格式化教程
為什麼要格式化程式碼
當團隊內有多人開發的時候,每個人寫的程式碼格式都有自己的喜好,也可能會忙著寫程式碼而忽略了格式的問題。
在之前,我們可能會寫完程式碼後,再一點一點去調格式,很浪費時間。
有了ClangFormat
外掛後,就可以一鍵把程式碼格式化成統一的樣式,不僅節省了時間,也使得程式碼更規範。我們還可以定製自己喜歡的樣式。
安裝ClangFormat外掛
裝好後是下圖這樣的,我們可以看到它內建了LLVM
、Google
、Chromium
、Mozilla
、WebKit
五種樣式。
外掛選單
使用方法
通過選單可以看到,它可以格式化選中的文字們,或者格式化選擇的檔案們。下面演示下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