はじめに
今回は、前回 のコード補完で軽く流したライブテンプレート展開と、それに関連したテンプレート系の入力補助機能について説明します。
ライブテンプレートの展開
コマンド名は"Insert Live Template "。
「ライブテンプレート(Live Templates) 」とは、Eclipseの「テンプレート」に相当する機能です。Eclipseを使っている人には信じられないかも知れませんが、テンプレートは通常のコード補完(Basic補完)の候補に出てきません。
図1 ライブテンプレートの展開
図2 Eclipseのテンプレート展開の例
プリセットされているテンプレート名も直感的ではなく、テンプレート展開のプレビューもでないため、正直言って使いやすくないです。テンプレートは「Preferences / Live Templates」に登録してあるので、筆者は真っ先に「iterations」のテンプレートを表1 のようにリネームして使ってます。
図3 「 Preferences / Live Templates」設定画面
表1 iterationsライブテンプレートの変更例
Description(説明) デフォルト値 変更後の値
Create iteration loop fori -
Iterate elements of array itar for_arr
Iterate elements of java.util.Collection itco for_col
Iterate java.util.Enumeration iten for_enum
Iterate Iteratable|Array in J2SDK 5.0 syntax iter for_each
Iterate java.util.Iterator itit for_ite
Iterate elements of java.util.List itli for_list
Iterate tokens from String ittok for_st
Iterate elements of java.util.Vector itve for_vec
Iterate elements of array in reverse order ritar for_rev
ちなみにライブテンプレートのプレビューはLiveTemplatePreviewプラグイン でできるようになります。詳しくは後の回で紹介します。
コードを囲んだライブテンプレートの展開
コマンド名は "Surround with Live Template "。
先ほどのライブテンプレートとは異なり、テンプレートを挿入するのではなく「選択範囲を」テンプレートで囲みます。Eclipseでいう「囲む(メニューバーの「ソース → 囲む」 ) 」に相当します。何も選択していない場合は、カーソル行が対象になります。
図4 ライブテンプレートで囲む(Surround with Live Template)の例
テンプレートの数は多くありません。先ほど紹介した「Preferences / Live Templates」の中の「Surround」カテゴリに含まれるテンプレートだけが候補に出てきます。
ショートカットキーは、先ほど紹介した "Insert Live Template " と別のキーがアサインされています。似たようなコマンドに "Surround With..." があり、こちらがこのコマンドを兼ねるため、ほとんど使ったことが無いです。
図5 "Surround With..."の展開例
[コラム]ライブテンプレートをBasic補完の候補に出すには
「Android Studioがそうなってる」といってもBasic補完の候補にライブテンプレートが出てこないのは、さすがに頭が固いと思います。開発元もそう思ったかは定かではありませんが、隠しオプションを有効にすることでBasic補完の候補にライブテンプレートを表示することができます。
やり方は「Find Action」を開き、"Include non-menu actions "をONにして "Registry " コマンドを実行します。「 Registry」ダイアログが表示されるので「show.live.templates.in.completion」を探して、チェックを有効にしてください。
図6 「 Registry」ダイアログの例
このオプションを有効にすることで、図7 のようにBasic補完の候補にライブテンプレートが登場します。
図7 Basic補完にライブテンプレートが出てくる
こんな便利な隠しオプションがあるなら、元から有効にしておけば良いと思うのですが、何か理由でもあるんですかねぇ……。
ライブテンプレートのカスタマイズ
「Preferences / Live Templates」でカスタマイズを行います。分かりづらいのですが画面右上のほうにある「+」「 -」ボタンでテンプレートやテンプレートグループを作成できます(既存のテンプレートのコピーもできます) 。
図8 ライブテンプレートの登録
ひとつ例にとってテンプレート定義の説明します。「 output / stdoutv」の定義を見てみましょう。
図9 「 output / stdoutv」の定義例
「Abbreviation」はテンプレートの名前です。ここに定義した名前が "Insert Live Templates " の候補にあがります。「 Description」はテンプレートの説明で、こちらも補完候補の右側に表示されます。わりとどうでも良い話なのですが「Description」に日本語を入力することも可能です(それを言ったら「Abbreviation」も日本語で登録できます) 。
図10 ライブテンプレートを日本語で登録してみた例
「Template text」には展開したいテンプレートそのものを定義します。テンプレートの書式には、ほんのちょっとだけルールがあります。テンプレート内で変数を使いたい場合は変数名をドル記号($)で囲みます。定義した変数の振る舞いについては「Edit variables」で定義していきますが、それは後ほど説明します。
変数には2つだけ定義済みのものがあります。1つは「$END$
」で、テンプレート展開後のカーソル位置を指定します。もう1つは「$SELECTION$
」で、テンプレート展開前に選択していた範囲を示します。こちらは主に "Surround with Live Template "用のテンプレート(surroundグループ)で用います。
「Edit variables」ボタンを押すと、図11 のようなダイアログが表示されます。
図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 ライブテンプレートを適用するファイルタイプを指定する
簡単なライブテンプレートの追加
コード片をコピーして、「 Preferences / Live Templates」を開き、新しいテンプレートを作り、そこにコード片をペーストする……なんて操作は正直煩わしいですよね。この操作を端折るのがメニューバーの「Tools → Save as Live Template...」です。
テンプレートに登録したいコードを選択状態にして "Save as Live Template " を実行すると、そのコード片をTemplate textにしたテンプレートを登録してくれます(Template Groupは"user") 。Template textに展開する際に、クラスを完全修飾名に変換するなどの気遣いはしています。
[コラム]Emmet/Zen Codingについて
「Preferences / Live Templates」のプリセットをみて気付いた人もいると思いますが、Android StudioはEmmet (Zen Coding)をサポートしています。ただし、Live TemplatesのZen HTMLやZen XSLはZen Codingのスニペット が登録されているだけで、Emmetそのものを有効にするには「Preferences / Emmet (Zen Coding)」の「Enable Emmet」を有効にする必要があります(デフォルトで有効になっているはずです) 。
図13 「 Preferences / Emmet (Zen Coding)」設定画面
ちなみにEmmetの展開に使うキーもTABキーです。「 Expand abbreviation with」で変更できますが、SPACEキー、TABキー、Enterキーの3択になります。
Android StudioのEmmet自体はCSSもサポートしているようですが、肝心のAndroid StudioがCSSをサポートしていないため使えないという何だかよくわからない事態になっています。元々がIntelliJから持ってきた機能なので、そういういびつさが出るのは仕方がないのでしょう。
Emmetサポートといっても実際にできることはExpand Abbreviation くらいです。その他のアクションについてはAndroid Studioが持っているコマンドで代用するしかなさそうです。一応、EmmetのCheat Sheet のSyntaxがすべて動くことは確認しました。
その他のテンプレートについて
テンプレート繋がりで他のテンプレートについて紹介します。先ほどのライブテンプレートの設定画面で左側の設定項目一覧に「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」ポップアップにファイルテンプレートが追加される
テンプレートの拡張子を「java」にした場合、そのテンプレートは「File → New」のポップアップで「Java」を選んだときのダイアログから選択できます。
図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の例)
カーソル位置には依存しません(厳密にはちょっとだけ依存してます) 。たとえば、Javaのメソッドボディにカーソルがある状態でコンストラクタ生成を実行すると、カーソル近辺の適切な場所にコンストラクタを生成します。
一番選択肢の多いJavaの内容を表2 にまとめました。
表2 Javaファイル上でのGenerateメニューの一覧
選択肢 意味
Constructor コンストラクタの生成
Getter getterメソッドの生成
Setter setterメソッドの生成
Getter and Setter getter/setterメソッドの生成
equals() and hashCode() equals()
メソッドとhashCode()
メソッドの生成
Override Methods... オーバライドメソッドの生成
Delegate Methods... 委譲メソッドの生成
Super Method Call super.メソッド名()
の展開(※メソッドボディ中でのみ有効)
Copyright Copyrightコメントの生成
toString() toString()
メソッドの生成
※ 「serialVersionUID
の生成」があっても良さそうですが、これは別の機能で実現しています(後の回で説明します) 。
どの選択肢を選んでもたいていの場合、何かしらのダイアログ(フィールド選択だったり、上位クラスのメソッド選択など)が表示され、対象を選んで「OK」ボタンを押すことで定型コードが生成されます。図18 はコンストラクタ作成の例で、実際に使ってみればニュアンスが分かると思います(ダイアログで複数選択する場合は、SHIFTキーかCtrlキーを使います) 。
図18 コンストラクタ生成時のダイアログの例
ありそうで無いのが、この定型コードのテンプレートを編集する機能です。あっても良さそうなのですが、どういうわけか伝統的にずーっと無いままでいます。筆者はそれに慣れてしまったので、何とも思わなくなっているのですが、あらためて考えると不思議なものですね。
なお、この「Code → Generate...」は、Eclipseで言うと「ソース」メニューの一部(図19 の枠部分)に相当します。
図19 Eclipseの「ソース」メニューのコード生成メニュー
[コラム]Copyrightについて
「Code → Generate...」の選択肢のひとつである「Copyright」ですが、これを実行すると、プロジェクトの所定のファイルにヘッダコメントを追加・更新します。
ヘッダコメントとはファイルの先頭に記述するコメントの事で、例えばオープンソースのコードでライセンス表記が記載されている部分を指します。
一見すると「そんなどうでもいい……」と思いますが、意外と高機能でコメントを付加するファイルやコメント位置、スタイルもファイルタイプごとに指定ができます(「 Preferences / Copyright」以下の設定画面) 。面白いところで、コメント枠の設定や枠を箱形に括るかどうかなども設定できます。
図20 「 Preferences / Copyright」設定画面
コメント部分はVelocity 風な置き換えキーワードがあります。コメントテンプレートの記述方法やCopyrightの設定の詳細についてはIntelliJのヘルプを参照してください。
参考:Copyright Profiles - IntelliJ IDEA Web Help
ファイルヘッダの更新はGenerateのポップアップからだけではなく、メニューバーの「Code → Update Copyright」からも行えます。「 Projctツールウィンドウ」でディレクトリを指定して実行すると、そのディレクトリ配下のすべてのファイルのヘッダコメントを更新することができます。
地味な機能ですが、意外なところで役に立つときがあるので「こんな機能もあるんだな」程度に覚えておいてもらえると幸いです。
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 "について説明します。