Android Studio最速入門~効率的にコーディングするための使い方

第12回エディタの[その4]─テンプレート展開

はじめに

今回は、前回のコード補完で軽く流したライブテンプレート展開と、それに関連したテンプレート系の入力補助機能について説明します。

ライブテンプレートの展開

コマンド名は"Insert Live Template"。

「ライブテンプレート(Live Templates⁠⁠」とは、Eclipseの「テンプレート」に相当する機能です。Eclipseを使っている人には信じられないかも知れませんが、テンプレートは通常のコード補完(Basic補完)の候補に出てきません。

図1 ライブテンプレートの展開
図1 ライブテンプレートの展開
図2 Eclipseのテンプレート展開の例
図2 Eclipseのテンプレート展開の例

プリセットされているテンプレート名も直感的ではなく、テンプレート展開のプレビューもでないため、正直言って使いやすくないです。テンプレートは「Preferences / Live Templates」に登録してあるので、筆者は真っ先に「iterations」のテンプレートを表1のようにリネームして使ってます。

図3 ⁠Preferences / Live Templates」設定画面
図3 「Preferences / Live Templates」設定画面
表1 iterationsライブテンプレートの変更例
Description(説明)デフォルト値変更後の値
Create iteration loopfori
Iterate elements of arrayitarfor_arr
Iterate elements of java.util.Collectionitcofor_col
Iterate java.util.Enumerationitenfor_enum
Iterate Iteratable|Array in J2SDK 5.0 syntaxiterfor_each
Iterate java.util.Iteratorititfor_ite
Iterate elements of java.util.Listitlifor_list
Iterate tokens from Stringittokfor_st
Iterate elements of java.util.Vectoritvefor_vec
Iterate elements of array in reverse orderritarfor_rev

ちなみにライブテンプレートのプレビューはLiveTemplatePreviewプラグインでできるようになります。詳しくは後の回で紹介します。

コードを囲んだライブテンプレートの展開

コマンド名は "Surround with Live Template"。

先ほどのライブテンプレートとは異なり、テンプレートを挿入するのではなく「選択範囲を」テンプレートで囲みます。Eclipseでいう「囲む(メニューバーの「ソース → 囲む⁠⁠」に相当します。何も選択していない場合は、カーソル行が対象になります。

図4 ライブテンプレートで囲む(Surround with Live Template)の例
図4 ライブテンプレートで囲む(Surround with Live Template)の例

テンプレートの数は多くありません。先ほど紹介した「Preferences / Live Templates」の中の「Surround」カテゴリに含まれるテンプレートだけが候補に出てきます。

ショートカットキーは、先ほど紹介した "Insert Live Template" と別のキーがアサインされています。似たようなコマンドに "Surround With..." があり、こちらがこのコマンドを兼ねるため、ほとんど使ったことが無いです。

図5 "Surround With..."の展開例
図5 

ライブテンプレートのカスタマイズ

「Preferences / Live Templates」でカスタマイズを行います。分かりづらいのですが画面右上のほうにある「+」⁠-」ボタンでテンプレートやテンプレートグループを作成できます(既存のテンプレートのコピーもできます⁠⁠。

図8 ライブテンプレートの登録
図8 ライブテンプレートの登録

ひとつ例にとってテンプレート定義の説明します。⁠output / stdoutv」の定義を見てみましょう。

図9 ⁠output / stdoutv」の定義例
図9 「output / stdoutv」の定義例

「Abbreviation」はテンプレートの名前です。ここに定義した名前が "Insert Live Templates" の候補にあがります。⁠Description」はテンプレートの説明で、こちらも補完候補の右側に表示されます。わりとどうでも良い話なのですが「Description」に日本語を入力することも可能です(それを言ったら「Abbreviation」も日本語で登録できます⁠⁠。

図10 ライブテンプレートを日本語で登録してみた例
図10 ライブテンプレートを日本語で登録してみた例

「Template text」には展開したいテンプレートそのものを定義します。テンプレートの書式には、ほんのちょっとだけルールがあります。テンプレート内で変数を使いたい場合は変数名をドル記号($)で囲みます。定義した変数の振る舞いについては「Edit variables」で定義していきますが、それは後ほど説明します。

変数には2つだけ定義済みのものがあります。1つは$END$で、テンプレート展開後のカーソル位置を指定します。もう1つは$SELECTION$で、テンプレート展開前に選択していた範囲を示します。こちらは主に "Surround with Live Template"用のテンプレート(surroundグループ)で用います。

「Edit variables」ボタンを押すと、図11のようなダイアログが表示されます。

図11 ⁠Edit Template Variables」ダイアログ
図11 「Edit Template Variables」ダイアログ

ここで、テンプレートに定義した変数ごとの振る舞いを定義していくのですが、見ただけでは何をしていいのかサッパリわかりませんよね。ちなみにIntelliJのヘルプはこちらになります。

参考:Edit Template Variables Dialog - IntelliJ IDEA Web Help

定義する内容は、変数ごとに「やるべきこと(Expression⁠⁠」や「デフォルト値(Default value⁠⁠スキップ可能かどうか(Skip if defined⁠⁠」を決めていきます。⁠やるべきこと」には自分以外の変数の値や固定値、その他にいくつかの関数が用意されています。どんな関数が用意されているかは、先ほどのヘルプを参照してください。ただし、ヘルプを見てもすぐ使いこなせはしませんので、まずはプリセットされているテンプレートの定義を参照してみるところから始めましょう(筆者もそうしてます⁠⁠。

がんばればそれなりに表現力のあるテンプレートを作れますが、使い勝手や融通さではEclipseのテンプレートのほうが優れていると思います。

話を「Preferences / Live Templates」の設定画面に戻します。⁠Options」ではテンプレート展開時の振る舞いを指定します。

  • 「Reformat according to style⁠⁠ - 現在のスタイルに合わせてフォーマットする
  • 「Use static import if possible⁠⁠ - 可能なら static import を使う
  • 「Shorten FQ names⁠⁠ - 完全修飾名を短くする(import文 を自動展開します)

設定画面の最下行にある「Applicable in」はテンプレートの対象範囲を指定します。設定そのものは「Change」リンクを押して行いますが「ちょっとやり過ぎじゃないか?」と思えるほど多彩な設定ができます。

図12 ライブテンプレートを適用するファイルタイプを指定する
図12 ライブテンプレートを適用するファイルタイプを指定する

簡単なライブテンプレートの追加

コード片をコピーして、⁠Preferences / Live Templates」を開き、新しいテンプレートを作り、そこにコード片をペーストする……なんて操作は正直煩わしいですよね。この操作を端折るのがメニューバーの「Tools → Save as Live Template...」です。

テンプレートに登録したいコードを選択状態にして "Save as Live Template" を実行すると、そのコード片をTemplate textにしたテンプレートを登録してくれます(Template Groupは"user"⁠⁠。Template textに展開する際に、クラスを完全修飾名に変換するなどの気遣いはしています。

その他のテンプレートについて

テンプレート繋がりで他のテンプレートについて紹介します。先ほどのライブテンプレートの設定画面で左側の設定項目一覧に「Preferences / File and Code Templates」があったのに気付いたかと思います。こちらがライブテンプレート以外のテンプレートの設定画面です。

図14 ⁠Preferences / File and Code Templates」設定画面
図14 「Preferences / File and Code Templates」設定画面

ここでは、いろいろな新規ファイルのテンプレートやAndroid Studioのコード生成機能で作られるメソッドのテンプレートを定義します。ライブテンプレートと異なり、設定できるテンプレートはある程度決められています(タブのカテゴリ別に決まっています⁠⁠。

タブそれぞれのカテゴリについて説明します。見ているとわかりますが、IntelliJの内容を引きずっており明らかに不要なテンプレートが残っています(いずれ整理されるのでしょうか?⁠⁠。

Codeタブ
Android Studioのコード生成機能で作られるメソッドやコード片のテンプレートです。このコード生成がどのようにして行われるのかについては、次回のインテンションのときに説明します。テンプレートの種類は決められていて、新しく追加したり、既存のものを削除することはできません。
Includesタブ
他のテンプレートにインクルードするテンプレートの断片を定義します。
Java EEタブ
「J2EE」と不似合いなタイトルが付いていますが、正しくはサポートしている言語やフレームワーク事のテンプレートを定義しています。どのようなカテゴリ、どのようなテンプレートがあるかは、言語サポートプラグインなどにより変動します。こちらもテンプレートの種類は決められていて、新しく追加したり、既存のものを削除することはできません。
Templatesタブ

新規作成するファイルのテンプレート群です。いわゆるファイルテンプレート。プリセットしてあるものは削除できませんが、任意のテンプレートを追加したり削除したりできます(なぜがプリセットの「Singleton」は削除できます⁠⁠。

ここに登録したテンプレートは「Projectツールウィンドウ」などからメニューバーの「File → New」を実行したときのポップアップに表示されます。

図15 ⁠New」ポップアップにファイルテンプレートが追加される
図15 「New」ポップアップにファイルテンプレートが追加される

テンプレートの拡張子を「java」にした場合、そのテンプレートは「File → New」のポップアップで「Java」を選んだときのダイアログから選択できます。

図16 Javaのテンプレートは「Create New Clas」ダイアログに出てくる
図16 Javaのテンプレートは「Create New Clas」ダイアログに出てくる

ライブテンプレートと同じく、こちらのテンプレートも独自のマークアップができます。文法はライブテンプレートと異なり、こころもち表現力も高めだと思います。こちらのテンプレートのマークアップ記法についても、IntelliJのヘルプが参考になるでしょう。

参考:File Templates - IntelliJ IDEA Web Help

ファイルテンプレートについては、テンプレートにしたいファイルをエディタで開いておき、メニューバーの「Tools → Save File as Template...」で登録することもできます。

定型コードの作成

コンストラクタの生成、getter/setterの生成といったお決まりのコード生成のことです。Android Studioではメニューバーの「Code → Generate...」で行います。

割り当てられているショートカットキーは「File → New...」と同じです。⁠Projectツールウィンドウ」「ナビゲーションバー」上で、そのショートカットキーを実行すると「File → New...」と解釈し、エディタ上で実行すると「Code → Generate...」と解釈します。

「Code → Generate...」で表示されるポップアップは開いているファイルの拡張子に依存します。

図17 ⁠Generate」ポップアップ(Javaの例)
図17 「Generate」ポップアップ(Javaの例)

カーソル位置には依存しません(厳密にはちょっとだけ依存してます⁠⁠。たとえば、Javaのメソッドボディにカーソルがある状態でコンストラクタ生成を実行すると、カーソル近辺の適切な場所にコンストラクタを生成します。

一番選択肢の多いJavaの内容を表2にまとめました。

表2 Javaファイル上でのGenerateメニューの一覧
選択肢意味
Constructorコンストラクタの生成
Gettergetterメソッドの生成
Settersetterメソッドの生成
Getter and Settergetter/setterメソッドの生成
equals() and hashCode()equals()メソッドとhashCode()メソッドの生成
Override Methods...オーバライドメソッドの生成
Delegate Methods...委譲メソッドの生成
Super Method Callsuper.メソッド名()の展開(※メソッドボディ中でのみ有効)
CopyrightCopyrightコメントの生成
toString()toString()メソッドの生成

serialVersionUIDの生成」があっても良さそうですが、これは別の機能で実現しています(後の回で説明します⁠⁠。

どの選択肢を選んでもたいていの場合、何かしらのダイアログ(フィールド選択だったり、上位クラスのメソッド選択など)が表示され、対象を選んで「OK」ボタンを押すことで定型コードが生成されます。図18はコンストラクタ作成の例で、実際に使ってみればニュアンスが分かると思います(ダイアログで複数選択する場合は、SHIFTキーかCtrlキーを使います⁠⁠。

図18 コンストラクタ生成時のダイアログの例
図18 コンストラクタ生成時のダイアログの例

ありそうで無いのが、この定型コードのテンプレートを編集する機能です。あっても良さそうなのですが、どういうわけか伝統的にずーっと無いままでいます。筆者はそれに慣れてしまったので、何とも思わなくなっているのですが、あらためて考えると不思議なものですね。

なお、この「Code → Generate...」は、Eclipseで言うと「ソース」メニューの一部図19の枠部分)に相当します。

図19 Eclipseの「ソース」メニューのコード生成メニュー
図19 Eclipseの「ソース」メニューのコード生成メニュー

Javadocコメントの生成

最後にJavadocコメントの生成について説明します。先ほどの定型コードの生成でコンストラクタやgetter/setterメソッドを生成してもJavadocコメントが生成されることは(ほとんど)無いです。

また、Eclipseを使っていた人は、Eclipseの以下の機能に相当するものを探したと思います。

  • 「編集 → メンバーに Javadoc コメントを付加」
  • 「編集 → 既存 getter/setter メソッドの Javadoc コメントを生成」
  • 「ソース → 要素コメントの生成」

残念なことに上記のような機能はAndroid Studioにはありません。メニューバーの「Tools → Generate JavaDoc...」という紛らわしいコマンドがありますが、こちらは「⁠⁠Javadocコメントではなく)Javadocそのものを生成する」コマンドです。

では、Android StudioでJavadocコメント生成する場合どうしたらよいかというと、Javadocコメントを書きたいメソッドやクラスの直前で/**とタイプして改行します。すると、そこにJavadocコメントのテンプレート(documentation comment stubと呼びます)が展開されます(似たような機能はEclipseにもありますね⁠⁠。

図21 Javadocコメントスタブの展開(クリックすると動きがわかります)

便利な機能ではあるのですが、Javadocコメントを付けたい対象ひとつひとつに/**と手打ちしなければならないため、getter/setterだらけのクラスなどでは、それほど便利とは言い難いです。ものすごく好意的に解釈して「テキトーなJavadocコメントなんて許しません。ひとつひとつ丁寧に書きなさい」というメッセージなのかな?と自分を納得させています。

ちなみに、この機能は「Preferences / Editor / Smart Keys」の"Insert documentation comment stub"をOFFにすると無効になります。

この機能が有効なのは新規にJavadocコメントを作った時だけで、すでにコメントが出来ている状態でパラメタ名をリネームしたり、パラメタを増減した場合、Javadocコメントを再展開する機能はありません(ただしリファクタリングメニューから同様の操作をした場合は反映されます⁠⁠。

最低限付けて欲しいJavadocコメントのJavadocタグや不完全なJavadocコメントなどは、別の機能(インスペクション)で検知することができます。この詳細についてはインスペクションの解説で改めて紹介します。

次回の予告

こうして機能を整理していくと、似たような機能でも設定できたりできなかったりと、違いが見えてなかなか興味深いです。長年使って馴れてしまうと、こういう細かな違いを気にしなくなりますが、新規参入組には迷惑な話だと思います。

次回はAndroid Studioの万能ナイフである"Show Intention Actions"について説明します。

おすすめ記事

記事・ニュース一覧