超詳細的Xcode代碼格式化教程,可自定義樣式。


超詳細的Xcode代碼格式化教程,可自定義樣式。

為什么要格式化代碼

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

有了ClangFormat插件后,就可以一鍵把代碼格式化成統一的樣式,不僅節省了時間,也使得代碼更規范。我們還可以定制自己喜歡的樣式。

安裝ClangFormat插件

可以手動安裝(下載GitHub項目編譯),也可以用Alcatraz(插件管理器)安裝,都很簡單,具體可以看我的文章《Xcode方便開發的插件推薦》

裝好后是下圖這樣的,我們可以看到它內置了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,其中小括號內代表他需的是什么類型的值。

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

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

這個是我在用的.clang-format文件。大家可以下載下來自己修改一下再用。

歡迎關注  和我的專題:iOS技術交流,查看更多好文章。
歡迎加入iOS技術交流群:244122891,這里有很多愛學習愛交流的人。

 

 

文/iOS_小松哥(簡書作者)
原文鏈接:http://www.jianshu.com/p/a725e24d7835
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM