Alcatraz(パッケージ管理ソフト)をXcodeにいれてClangFormatを手軽につかえるまでの手順

## 背景
複数人でリファクタリングをするに当たって、コード規約どうするかと同じくらい大切なのは、それをどう守っていくかということです。
できるなら、人力でやるより、自動化するのが楽だということで、コードをいい感じにフォーマットしてくれるClangFormatを導入することにしました。

## 公式ドキュメント
http://clang.llvm.org/docs/ClangFormatStyleOptions.html

## 導入

http://alcatraz.io/

インストール手順はこれだけ  

```
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
```

アンインストールするときはこれ

```
rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin
```

キャッシュを削除するときはこれ

```
rm -rf ~/Library/Application\ Support/Alcatraz
```


実行すると

```
hoge-no-MacBook-Pro:Desktop tac$ curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
2016-02-04 17:42:39.404 defaults[98535:1903663] 
The domain/default pair of (/Users/tac/Library/Preferences/com.apple.dt.Xcode, DVTPlugInManagerNonApplePlugIns-Xcode-7.2) does not exist
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   590    0   590    0     0    493      0 --:--:--  0:00:01 --:--:--   493
 15  106k   15 16975    0     0   6382      0  0:00:17  0:00:02  0:00:15 16182x Alcatraz.xcplugin/
x Alcatraz.xcplugin/Contents/
x Alcatraz.xcplugin/Contents/Info.plist
x Alcatraz.xcplugin/Contents/MacOS/
x Alcatraz.xcplugin/Contents/Resources/
x Alcatraz.xcplugin/Contents/Resources/ATZPackageListTableCellView.nib
x Alcatraz.xcplugin/Contents/Resources/ATZPluginWindowController.nib
x Alcatraz.xcplugin/Contents/Resources/bitbucket_grayscale.tiff
x Alcatraz.xcplugin/Contents/Resources/en.lproj/
x Alcatraz.xcplugin/Contents/Resources/eye_icon.tiff
x Alcatraz.xcplugin/Contents/Resources/git_grayscale.tiff
x Alcatraz.xcplugin/Contents/Resources/github_grayscale.tiff
x Alcatraz.xcplugin/Contents/Resources/link_icon.tiff
x Alcatraz.xcplugin/Contents/Resources/en.lproj/InfoPlist.strings
x Alcatraz.xcplugin/Contents/Resources/en.lproj/Localizable.strings
100  106k  100  106k    0     0  35754      0  0:00:03  0:00:03 --:--:-- 76027

Alcatraz successfully installed!!1!🍻  Please restart your Xcode (7.2).
```

Xcodeをリスタートすると脅されます。
要約すると、"これ、アップル製じゃないから、このプラグインをいれるとXcodeなどの安定性やセキュリティに悪い影響を与えますよ"の意味。


<img width="420" alt="Xcodeプラグイン「Alcatraz」の導入_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/40229/ca99df7f-6d1a-cb95-feac-12bace490182.png">

そして、xcodeを開くと

<img width="1680" alt="スクリーンショット_2016-02-04_17_59_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/40229/b1534ee8-3f86-d8c4-a323-afe5b08ba252.png">

PackageManagerが表示されます。
そして、ChangFormatと入力。

<img width="1680" alt="スクリーンショット_2016-02-04_18_00_19.png" src="https://qiita-image-store.s3.amazonaws.com/0/40229/f63b2173-f5f4-8543-498c-cfe97d031a0f.png">

インストール後Xcodeを再起動。


<img width="419" alt="read_swift_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/40229/ad61b04d-485e-05dc-031f-79c17a0d487d.png">

また出ます。


Load BundleをクリックしてXcodeを開くと、

<img width="1680" alt="スクリーンショット 2016-02-04 18.03.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/40229/ac1161b9-97c5-9eee-ba22-7a3bcad2f455.png">


ChangFormatが使えるようになっています。

使い方としては、自分のPCのホームディレクトリに.clang-formatファイルを置いて、xcode > Edit > Clang Format > Format File in Force をクリックすると整形されます。

## .clang-formatのサンプル　
自分の設定ですが、こんな感じです。

```
BasedOnStyle: LLVM
AlignTrailingComments: true
BreakBeforeBraces: Attach
ColumnLimit: 120
IndentWidth: 4
Language: Cpp
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PointerBindsToType: false
SpacesBeforeTrailingComments: 1
UseTab: Never
``` 


## ClangFormatのOption

公式ドキュメントはこちら
http://clang.llvm.org/docs/ClangFormatStyleOptions.html

* BasedOnStyle
基本的なスタイルを設定します。
自分はObjctive-Cでの設定なのでLLVMコーディングのスタイルで設定。他にもGoogleなどがあります。
  

* BreakBeforeBraces
波括弧{}のフォーマットスタイル
  * Attach  
 常に周囲のコンテキストに波括弧{}を付ける  
 * Allman  
 Attachとは逆

* ColumnLimit
    カラムの上限

* Language
  * Cpp
  公式ドキュメントによるとObjCも含むのでこれを指定

[こちら](http://algo13.net/clang/clang-format-style-oputions.html)の記事がとても良くまとまっていたのでOptionについて細かく解説するよりかは、こちらを見ていただくほうが正確だと思われます。