【Android Studio】コードスニペットを使ってみよう！

# コードスニペットとは
code snippetを直訳すると *コードの切れ端* という意味になります。
Androidアプリ開発に限らず、コードスニペットをうまく活用できると
コーディング速度が**爆上がり**するらしいです。

これまで、他の言語を利用する上でもあまり気にしていなかった部分であり、
実際に少し触ってみると便利だなと思ったので設定方法の備忘も兼ねてご紹介していきます。

# Android Studioにおけるコードスニペット
Androidアプリの統合開発環境であるAndroid Studioでは、
コードスニペットを**Live Templates**と呼んでいます。
そのため、本記事でもこれ以降はLive Templateと記載していきます。

# 設定方法
下記の開発環境での設定方法を紹介していきます。

* macOS Catalina Version 10.15.4 Beta
* Android Studio 3.5.2
* Kotlin

今回は、デバッグログを出力する

```
android.util.Log.d
```
を

- タグ・・・クラス名
- メッセージ・・・メソッド名：テキスト

なフォーマットで**爆速**でコーディングするLive Templatesを設定していきます。

## テンプレートの追加
まずはテンプレートを追加します。

メニューバーから 
Android Studio -> Preferences... -> Editor -> Live Templates
の順で選択し、テンプレート編集画面を表示します。

<img width="1325" alt="Screen Shot 2020-03-16 at 19.46.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/e1f4e9b7-c0da-97ea-df85-533f0f6e24f9.png">

実は、``` android.util.Log.d ``` のある程度のテンプレートは
Android Studioが既に用意してくれています。
Live Templates の AndroidLog を開くと、*logd* というテンプレートがあります。
これが既に用意してくれている、ある程度のテンプレートです。

<img width="1325" alt="Screen Shot 2020-03-16 at 19.47.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/bdcc12b6-b7a4-8fa2-d0ae-90e6aa4f6043.png">

AndroidLog の *logd* テンプレートを選択した状態で ```command``` + ```c``` を押下し、
Kotlin を選択した状態で ```command``` + ```v``` を押下すると *logd* テンプレートが Kotlin にコピーされます。

<img width="1325" alt="Screen Shot 2020-03-16 at 21.04.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/432ce087-9a86-10ab-2305-8c6a72be9ea9.png">

これでテンプレートの追加は終わりです。

## テンプレートの編集
AndroidLog から Kotlin へ *logd* テンプレートを移動させましたが、
このままでは Live Template として利用することはできません。

利用できるように、ここからテンプレートを編集していきます。

### コンテキストの変更
先ほど追加したテンプレートが Live Template として利用できない理由として
コピペしただけでは、Kotlin で利用できるテンプレートとして認識されていないということが挙げられます。
コンテキストを変更して、Kotlin で利用できるテンプレートということを認識させます。

Kotlin の *logd* テンプレートを右クリック -> Change context...をクリック -> Kotlin にチェックを入れてOK
<img width="1219" alt="Screen Shot 2020-03-16 at 20.02.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/ce63b325-fefb-6c7d-b2fc-391bfab0d076.png">


これでひとまず、Kotlinのコード上で *logd* と入力するとインテリセンスが効いて
こんなテンプレートがコード上に展開されるようになります。
<img width="300" alt="Screen Shot 2020-03-16 at 20.05.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/729d848e-13ba-c014-b873-3ee615a528fc.png">

ただこのテンプレートでは、画像の通り

* メソッド名を自分で入力する必要がある
* TAGを別途定義する必要がある

など、**爆速**というには程遠い状態です。

ここからテンプレートを使いやすいように編集していきます。

### テンプレート変数の編集

Android Studio -> Preferences... -> Editor -> Live Templates
でテンプレート編集画面を表示した後、
Kotlin の *logd* テンプレートを選択すると、画面下部の Template text ウィンドウでテンプレートの内容を編集することができます。

ここからテンプレート変数を編集して、このテンプレートの欠点であった

> * メソッド名を自分で入力する必要がある
> * TAGを別途定義する必要がある

これらの点を解消していきます。

#### メソッド名の自動補完
*logd* テンプレートのメソッド名を自動で補完するように設定していきます。

Template text ウィンドウの右側にある、"Edit variables" ボタンを押下して、METHOD_NAMEのExpressionを ``` methodName() ``` から ``` kotlinFunctionName() ``` に変更してOKを押下します。
<img width="638" alt="Screen Shot 2020-03-16 at 20.29.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/27fe6110-055f-c68a-c31e-52920ff7778e.png">
メソッド名の自動補完はこれで完了です。

#### クラス名の自動補完
*logd* テンプレートで ```TAG``` と展開されていた箇所を自動で補完するように設定していきます。

まず、Template text ウィンドウのテンプレートを下記のように変更します。

```
android.util.Log.d("$CLASS_NAME$", "$METHOD_NAME$: $content$")
```

変更したのは下記の2箇所です。
* TAG を "\$CLASS_NAME$" 変数に変更
* Kotlinで不要な末尾のセミコロンを削除

そして先ほどと同様、"Edit variables" ボタンを押下して、
CLASS_NAMEのExpressionを下記のように設定します。

```
groovyScript("_1.take(Math.min(23, _1.length()));", kotlinClassName())
```

クラス名をそのまま利用するかと思いきや、
ログに出力できるタグは最大23文字までなので少し細工します。

そして、CLASS_NAMEの Skip if defined にチェックを入れてOKを押下します。
<img width="638" alt="Screen Shot 2020-03-16 at 20.36.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/6939d81f-15db-9ac1-d02e-db9a0c0bc5fc.png">
## 完成！
Kotlinのコード上で *logd* と入力してみましょう。
<img width="500" alt="Screen Shot 2020-03-16 at 20.41.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238072/6a4986f1-8964-92e3-a0d9-704c4f4c1ec1.png">
・・・**爆速**！

# 最後に
Android開発で便利なテンプレート、その他開発ツール等あればぜひぜひご教示ください！！
最後までご覧頂きありがとうございました。

# 参考
https://stackoverflow.com/questions/44381348/live-template-not-working-in-kotlin