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

gzxb4029 8年前發布 | 18K 次閱讀 Xcode LLVM Android開發 移動開發

為什么要格式化代碼

當團隊內有多人開發的時候,每個人寫的代碼格式都有自己的喜好,也可能會忙著寫代碼而忽略了格式的問題。

在之前,我們可能會寫完代碼后,再一點一點去調格式,很浪費時間。

有了 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

 

 本文由用戶 gzxb4029 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!