What’s Cool In IntelliJIDEA. Part II - 2

はじめに


これは、What' s Cool In IntelliJIDEA. Part IIの翻訳(の一部)です。


前回分はこちら。


http://d.hatena.ne.jp/fuzzhead/20111128/

自分用のテンプレートを定義する方法

IntelliJはデフォルトの状態でもたくさんのテンプレートがあるが、必要なケースを完全にカバーするわけではない。それゆえ、この投稿の主目的は、IntelliJでLiveTemplateを独自に定義する方法を紹介することだ。最初に、ユースケースをでっちあげてみよう。すなわち、IDEにはデフォルトでは用意されていないが、もっと速くタイプする手段がほしいというような場合だ。


いくつかの理由から、IntelliJではデフォルトではtry-catchテンプレートを提供していない。単に空のtry-catch文を作るのではなく、既存のステートメントをtry-catchで囲みたい場合、このような方法がある。Settings windowを開いて(Ctrl+Alt+S)、Live templatesと[左上のテキストボックスに]入力する。これで、templates 設定が表示されるので右側に表示されるAddボタンを押す。


予め決まったテキストを出力するだけの単純なテンプレートを作成するのはとても簡単だ。
空のtry-catchブロックを定義するには、[テンプレートとなる]コード自身とそれを表す短縮形を入力すればよい。その際、チェックボックスで、そのテンプレートをJavaコンテキストに関連付けるのを忘れないようにする。


http://4.bp.blogspot.com/-IXWGY4yydPs/ThjirKCdVUI/AAAAAAAANmE/ln_PdSKwPMc/s1600/intellij-live-templates-add1.png


これは全くばかなテンプレートで全然賢くない。もし、catch節の例外の型を補完したいと思ったらどうだろう。テンプレート適用後に、特定の場所にカーソルを移動させたい場合はどうだろう。もう少し賢いテンプレートを作ってみよう。


http://4.bp.blogspot.com/-6Nfy0vsX-RY/ThojqJcvd5I/AAAAAAAANmM/eq8mazYyguE/s1600/intellij-live-templates-add2.png


catch節で使用する例外の型を補完できるよう、catch節に変数($EXCEPTION$)を追加し、IntelliJで提供される特別な関数を使って、その変数の値を決めるようにする。つまり、java.lang.Exceptionのサブクラスになるようにしたいので、subtype(<型>)関数を使用している。


私が別の変数,$END$を使っているのにおそらく気が付いただろう。しかし、ダイアログウィンドウには何の値も設定されていない。これは事前に定義された変数であり、テンプレート内で全ての選択操作が終わった後、どこにカーソルを置くかを表す。


tryと入力しスペースキーを押すと、テンプレートが以下のように展開される。


http://3.bp.blogspot.com/-K0ndNYL7BXk/Thokii0ECOI/AAAAAAAANmU/lRX-pSVRIPQ/s1600/intellij-live-templates-add3.png


まず、例外の型を選ぶためにcatch節にカーソルが置かれる。どの型にするかを決めてエンターキーを押した直後、カーソルはtryブロック内に置かれる。


さらに、特別な関数を使ってCtrl+Spaceをエミュレートし、例外のインスタンスに対して呼び出すメソッドを選択できるようにしてみよう。これは架空の例だが、そうしたいのだと仮定しよう。


この目的を達成するため、テンプレートエディタにて$METHOD$変数を定義し、complete()関数に割り当てた。


http://2.bp.blogspot.com/--XaR9JnlvTc/Thom-K6J-9I/AAAAAAAANmc/TGUSEtPhv0I/s1600/intellij-live-templates-add4.png


例外の型が選択されると、次は、catch節の例外に対するメソッド候補が補完がされ、
選択可能なメソッドの一覧がポップアップされる。

http://4.bp.blogspot.com/-q2Q4uzsO4uU/Thon45bkXPI/AAAAAAAANmk/-bvK6Fbo1GI/s1600/intellij-live-templates-add5.png


Live Templateで変数割り当てに使用可能な関数はたくさんある。これらの良い点は、Javaだけではなく他の言語、例えば、JavaScript、HTMLやGroovyでも使えることだ。

Surround with template

IntelliJで使える他のタイプのLive templateにsurrounding templateというのがある。
これは、テキストを選択し(あるいは単に望む位置にカーソルを置き)、
Ctrl+Alt+Tショートカットキーを押すと、テンプレートの一覧がポップアップで表示される
ということだ。


surrounding templateを独自に定義するのは、選択されたコード(またはテキスト)が、予め定義された$SELECTION$変数に割り当てられているという点以外は、通常のテンプレートと何の違いもない。テンプレートがこの変数$SELECTION$を含んでいる場合、そのテンプレートはCtrl+Jで表示される通常のテンプレート一覧には表示されなくなる。


独自のsurrounding templateを定義する例を作ってみよう。
選択したテキストを引用符で囲いたいとする。これはとてもシンプルなテンプレートだ。
テンプレートエディタ内で、単に$SELECTION$変数の外側を引用符で囲うだけだ。


http://4.bp.blogspot.com/-okGJbt_rEkQ/ThozIqdx_2I/AAAAAAAANms/doPsNpgwpGs/s1600/intellij-live-templates-surround.png


テキストを選択した状態でCtrl+Alt+Tショートカットキーを押しQキーを押すと、
選択したテキストが引用符で囲われるようになる。

http://4.bp.blogspot.com/-8pvQPH0YJDk/Tho0RSviHZI/AAAAAAAANm0/vv9FsB1NxTc/s1600/intellij-live-templates-surround2.png

まとめ

IntelliJを使うなら、Live Templateはコードを速く打つための生活必需品とすべきだ。IntelliJには標準テンプレートがたくさん定義されているが、標準テンプレートに限定されることはない。自分のコードの特性にあわせて自分のテンプレートを定義したまえ。後悔はしないだろう。