コードテンプレートを瞬時に展開可能なCode SnippetとLive Templateの設定・使用・共有方法

## 概要

XCodeとAppCodeには、**事前登録したコマンドで任意のコードを展開できるCode Snippet(XCode)とLive Template(AppCode)という機能がある。**
開発で頻出するコード群をここにまとめておくと大変便利で、しかも**ファイル化してエクスポートできるため、チーム内での共有も簡単にできる。**
そこでXCodeとAppCodeのそれぞれで、スニペットを設定し、使用、共有する方法を紹介する。

経験上「0から書いていくのはダルいが、かと言って既存ファイルをコピー&リネームして不要なコードを削除するのも面倒」という場合に、この機能は役立つことが多い。
例えば以下のようなコードは、よく使う場合にコマンドで展開できるとストレスが少なく嬉しい。

- ViewControllerのライフサイクルメソッド :star: 
- Custom Viewのライフサイクルメソッド
- アノテーション付コメント :star: 
- Promiseのチェーン
- 構造が複雑だけどよく使うコード群 (コールバックが複雑なUtil系メソッドとか)
- 呼び出しが長くなりそうなやつ (UserDefaults周りのメソッドとか)

単に自分の作業負荷が減るだけでなく、**同じフォーマットのコードが展開されることでチーム内での書式統一にも役立つはず**なので、各自のチームでスニペットを作成しチーム内で共有することをぜひオススメしたい。

## 開発環境

- Swift 4.0
- XCode 9.2

## 設定方法

まず登録したいスニペットを考える。
**スニペットにはプレースホルダが使える**ため、展開するコードに可変の箇所があっても構わない。
今回は`// @TOOD - <comment>`のようなアノテーションコメントを展開するCodeSnippetを作成し、`<comment>`の部分をプレースホルダにする。

### XCode (Code Snippet)

![codesnippet.gif](https://qiita-image-store.s3.amazonaws.com/0/17214/2589af4d-608b-a526-945e-57217652a8fd.gif)

1. 適当なSwiftファイルで上記のコードを入力
2. 次に上記のコードをCode Snippet Library(`Ctrl + Cmd + Alt + 2`)の領域へShiftを押しながらドラッグ＆ドロップ
3. するとダイアログが出てきて以下の項目を聞かれるので適宜入力
    - Title (スニペットのタイトル、任意のわかりやすい名前で)
    - Summary (スニペットの概要、無くても :ok:)
    - Platform (スニペットが有効なプラットフォーム、今回はいちおうiOSを選んでおく)
    - Language (言語、Swift)
    - Completion Shortcut (展開する際のコマンド、適宜短く、分かりやすく、打ちやすいものを、今回は `todo` にしておく)
    - Completion Scopes (展開が可能=補完候補に表示されるコンテキスト、今回はひとまずALL)
10. ダイアログ下部でもCode Snippetを編集できる。ここで**プレースホルダを入れる場合は `<# comment #>` のように入力すると自動的にプレースホルダ化してくれる。**若干入力方法がややこしかったりXCode側の表示がおかしい部分もあるが特に問題ない。
11. Doneを押して登録完了。

### AppCode (Live Template)

![livetemplate.gif](https://qiita-image-store.s3.amazonaws.com/0/17214/a9561e68-a389-c5d5-36b1-45432c43a755.gif)

1. 設定(`Cmd + ,`)から `Live Templates`　の項目を選択
2. 拡張子ごとにTemplate Groupでまとめられているので今回はSwiftを選択した状態で右上の :heavy_plus_sign: ボタンから"1. Live Template"を選択。なおチームごとにTemplate Groupを作ってその中にまとめるのもアリ。
3. 以下の項目を入力する
    - Abbreviation (展開する際のコマンド、 今回は `todo`) 
    - Description (スニペットの概要、説明で表示されるが無くても :ok:)
    - Template text (スニペットのテキスト、プレースホルダは変数部分の両端を `$` で囲う。これを設定して初めて"Edit variables"メニューが有効になる)
    - コンテキスト (スニペットが有効な言語とコンテキスト、今回はSwiftに :heavy_check_mark:)
8. Edit variables内は指定しなくても動くが細かく設定したい方は任意で
9. 上記を全て入力したら設定を"Apply"後使用可能に

## 使用方法

![Code Snippetのサンプル](https://raw.githubusercontent.com/imaizume/swift-snippets/master/assets/swift-snippets.gif)

XCode/App Codeともコード展開は至極カンタンで、上記で設定したコマンドを打つだけで**補完候補にテンプレートが現れるのでそのままTABで展開するのみ。**

## 共有方法

作成されたCode Snippetはそれぞれ次の場所に保存されているので、適宜こちらをコピーして同じディレクトリに入れてもらえば配布完了

- XCode: `~/Library/Developer/Xcode/UserData/CodeSnippets/`
- AppCode: `~/Library/Preferences/AppCodeYYYY.M/templates/` (`YYYY.M` はAppCodeのバージョン、自分の環境に合わせて書き換える :pencil2:)

自分のチームでは**プロジェクト内にConfigという名のディレクトリを作成し、そこに上記スニペットファイルとファイルコピー用のシェルスクリプトを入れて共有しているため、初期設定時にテンプレートも登録してしまうようなしくみを作っている。**

## スニペットの例

以下のリンクは現在自分のチームで共有しているコードスニペットとほぼ同様のものなので参考にしてもらいたい。

[imaizume/swift\-snippets: Snippet files for swift coding](https://github.com/imaizume/swift-snippets)

大別すると以下の2種類がある。

### ViewControllerのプロパティとメソッド

ViewControlleｒを追加する度、ライフサイクルメソッドは必ず書くことになるので全てのメソッドを展開する。
また適切なライフサイクルメソッドからViewの描画処理を呼び出し、さらにスコープごとにコメントで分けたいため、ViewControllerのテンプレートとしてまとめている(冒頭のアニメーション)。

### MARK付きコメント

XCodeでは `MARK - ` をつけてコメントすると、メソッド定義(`Ctlr + 6`)で表示されるためチーム内で使用を推奨している。
そのためスニペットにも`MARK`にからむテンプレがいくつか入っている。

## まとめ

使用頻度が高いテンプレコードはCode Snippet/Livet Templateにまとめてしまおう。
そうすることで**手入力の手間を減らすことはもちろんのこと、フォーマットの統一にも役に立つ。**
そして、チームごとによく使うコードは異なるはずなので、チーム内でテンプレファイルを作成して共有することをオススメする。

## 参考リンク

- [Xcodeでコードスニペット（入力補完）を追加する方法【開発効率向上】 \- Qiita](https://qiita.com/gmaesak/items/d53d82b170e3486f0886)
- [imaizume/swift\-snippets: Snippet files for swift coding](https://github.com/imaizume/swift-snippets)
- [Sharing Live Templates \- Help \| IntelliJ IDEA](https://www.jetbrains.com/help/idea/sharing-live-templates.html)