31日間ReSharper一周 ... それIDEAでもできるよ(その7)

Day 15: Ctrl+Spaceの一族(http://matarillo.com/resharper/day15.php

「Ctrl+SPACEの一族」とは良く言ったモノだ。ReSharperと同じ流れを組むIDEAにも「Ctrl+SPACEの一族」が存在する。

Ctrl+SPACE Basic code completion(the name of any class, method or variable)
Ctrl+SHIFT+SPACE Smart code completion(filters the list of methods and variable by expected type)
Ctrl+ALT+SPACE Class name completion(the name of any project class independently or current imports)

こうしてみると,キーバインドも機能もReSharperとなんら変わるところはないな。


一見すると便利そうな機能なんだけど,あたしはちょっと不満がある。まずなにより,キーコンビネーションが気に入らない。なぜ常にCtrlキーを押さねばならぬのだ。この手の小指を酷使するキーコンビネーションは極力どうにかしてもらいたい。
そんなこともあって,あたしは以下のようにキーコンビネーションをアサインしなおしている。

デフォルト 変更後
Ctrl+SHIFT+SPACE SHIFT+SPACE
Ctrl+ALT+SPACE ALT+SPACE

#ALT+SPACEはWindowsとカブるし,それほど用途もないので, "Class name completion"はそのまま。


これで,小指が痙りそうになることもない。:-D




待て待て待て。不満なのは,そんなどうでもいい所ではないんだ。もちょっと本質的な部分にある。すでに気づいてるEclipse, NetBeansユーザの方々は,IDEAのことをバカにしてくれてもいい。そんな不満がこの機能にはある。


説明しやすいように,実際のコード入力を例にするとしよう。

List list = Collections.emptyList();

それでは,上記のコードを入力するまでにどんな操作をするのか,順を追って説明する。IDEA以外のJavaIDEを使っている人は,そのIDEなら,どうなるかを比較してみるといい。


まずは「List |」とタイプしたのち,Ctrl+SPACEを押し変数名を補完する。


続いて「List list = |」までタイプして,再度Ctrl+SPACEを押しても,あまり幸せにはなれない。

#宣言済みの変数や,インポート済みのクラスなどが辞書順に表示されるだけ。


ここでやりたいのは「クラス名」の補完なので,押すべきは"Class name completion"のCtrl+ALT+SPACE。それに,"Class name completion"は,ReSharperと同じく,数文字タイプしないと発火しないので,「List list = Co|」くらいまでタイプしてから押す。


最後にメソッドの確定なんだけど,「List list = Collections.|」までタイプが終われば,自動的にメソッド(やメンバ変数など)の候補があがる。この候補一覧は"Basic code completion",つまりCtrl+SPACEを押したのと同等なので,受け取る型に関係なく,Collectionsが持つメソッドなどを辞書順に表示するだけだ。


一覧に出る候補の数がそれほど多くなければ,このまま探してもいいんだけど,めまいを起こすほどの数になると話は別だ。そんなときに,やっと"Smart code completion(Ctrl+SHIFT+SPACE)"が役に立つ。"Basic code completion"の候補一覧が出てる最中でも構わないので,Ctrl+SHIFT+SPACEを押して,"Smart code completion"を実行する。すると,候補一覧は受け取る型(List)のみに絞られるってワケだ。


これがね,今までテキストエディタを使ってきてて,IDEはIDEAが初めてってんなら拍手喝采,IDEAスゲーって言えるんだけど,EclipseNetBeansが普及していてIDE使うのは当たり前な世の中じゃそうはいかない。むしろ,

「たった1行タイプするのに,何種類の補完を使い分けたんだ?」

ってなるだろうよ。


わざわざ言うまでもないが,使い分けた補完は「Basic/Class name/Smart」の3つ。んで,それぞれ発火するキーコンビネーションは「Ctrl+SPACE/Ctrl+ALT+SPACE/Ctrl+SHIFT+SPACE」。目的に応じて補完方法が数種類あるのは許せるんだけど,キーバインドも異なるってのは,イマドキのIDEとしてはどうよ?と思う。


ちなみに,EclipseとNetBeans6.0M9でも試してみたが,Ctrl+SPACEだけ押してれば何とかなった。特にNetBeans当初IDEA風なキーバインドだったんだけど,いつの間にかCtrl+SPACEのみに統合されたみたい。まあ,正直イケてるとは言い難いもんね。


参考までに,NetBeans6.0M9での「Ctrl+SPACE一族」のキーバインドを以下に示す。

Ctrl+SPACE OTHER > Show Code Completion Popup
Ctrl+SHIFT+SPACE OTHER > Show Documentation Popup
Ctrl+ALT+SPACE OTHER > Show All Code Completion Popup


その昔,初めて"Smart code completion"がIDEAに追加されたときは,とても感動したのを覚えている。当時これができたのはIDEAだけだったし,キーバインドが"Basic code completion"と違っても,そのときは違和感はなかった。でもねー,Eclipseでも出来るようになり,そのうちNetBeansでもできるようになる今となっては,ちょっとなーと思うワケだ。


素のVisual Studioのコード補完がどうなのか寡聞にして知らないんだけど,VS使いの人たちはReSharperの「Ctrl+SPACEの一族」のことをどう思っているんだろう?好意的に受け止めているのだろうか?
#あたしは,もちっと頑張って欲しいと思っている。:-D


さんざん不満を述べておいて,こうゆう結末はどうよ?と思うが,この不満に対する解決策がある。それは,これ。
CodeCompletionLive

CodeCompletionLive cycles through several completions. By default it is binded to Ctrl-Shift-Alt-U but it's better to rebind it to for example Ctrl-Space. To do that open Keymap from Settings, under Plug-ins - CodeCompletionLive you will see one action CodeCompletionLiveAction, bind it to a new shortcut. First it checks Smart Code Completion (Ctrl-Shift-Space) if no suggestion available it checks Basic Code Completion (Ctrl-Space) if still IDEA could find anything it triggers Class Name Completion (Ctrl-Alt-Space).

数ヶ月前からこのプラグインを"Ctrl+SPACE"に割り当てて使ってるんだけど,だいたい,こちらの思惑通りに補完方法を切り替えてくれる。
プラグインで実現できるくらいなんだから,いっそのこと本体に取り込んでくれればいいのにって思うが,IDEA7のロードマップにそれらしい事は書いてなかった。:-(
#まあ,これ以上ぜいたくは言うまい。


(追記)そういや,こんなムービー作ってたんだった.改めて見ると,なにを訴えたかったか分からん内容だけど,もったいないので晒しておく.


おまけ:Live Templateの挿入

前回のおまけが自虐ネタだったように,今回のおまけもIDEAのイケてない(と思われる)機能の紹介だ。なんで「と思われる」なんて奥歯に物の詰まった言い回しなのかと言えば,当の本人はそれに慣れちゃって,今となっては,そんなに不便に思わなくなっているからだ。
でも,EclipseNetBeansと比べると間違いなく見劣りする部分なので,あえて紹介しよう。


最近のモダンなIDEのほとんどが備えているように,IDEAにもLive Templateと呼ばれるコードの切れ端を入力する機能がある。
Eclipseでは単に「テンプレート」,NetBeansでは「コードテンプレート」と呼ばれるアレだ。


この機能,おきまりの定型文やイディオムを入力するのにとても重宝するんだけど,IDEAの場合,ほかとはちょっと変わったところがある。もったいぶって,ちょっと遠回しに説明するよ。
EclipseNetBeansの場合は,テンプレートの挿入の起動キーは,いつも使い慣れた"Ctrl+SPACE"だ。一覧表示されるプロポーザルのアイコンで,それがテンプレートなのか,そうでないのかが区別できる。
それに,クラスやメソッドでJavadocや実装部分がプレビュー表示されるように,テンプレートの展開イメージもプレビューされる。

Eclipseの例:テンプレートに説明文を付けることもできる。これが一番優秀かも。



NetBeansの例:ちょっと分かりづらいけど,候補の右側が入力すべきテンプレート名。


で,IDEAだ。ここまでくれば大体想像が付くと思うんだけど,IDEAの場合,"Basic code completion(Ctrl+SPACE)"ではテンプレートは候補に挙がらない。テンプレートを入力する場合は,「テンプレートを入力したいんだ」とIDEAに知らさないといけないんだ。そのコマンドは,"Insert Live Template...(Ctrl+J)"。
"Ctrl+J"を押せば,こんな感じで候補が表示される。


ご覧の通り,とてもあっさりしている。プレビューが出ないのを覗けば,NetBeansに非常に似ている(ってNetBeansがIDEAをマネたのが正しい)。起動キーがCtrl+SPACEじゃないのはガマンできるとして,プレビュー出来ないってのは不満だ。
このLive Template,実はそれなりに凝ったことできるようなんだけど,肝心のテンプレート名を覚えきれず,ほとんど使えないでいる。とても残念だ。

#Live Templateの管理画面。結構な量がプリセットされてる。


あと,プリセットのテンプレート名がイケてないってのも,Live Templateを使いこなせない理由のひとつかと思う。たとえば,

psf public static final
psfi public static final int
psfs public static final String

などは使ったことすらない。この悪しきテンプレート名は,NetBeansも輸入してるんだけど,パクるほどのモノかなぁ...。


それと,よく使いたいんだけど,デフォのテンプレート名があんまりなのがこいつら(覚えやすいように名前変えてるけど)。

    変更後
itar Iterate elements of array for.arr
itco Iterate elements of java.util.Collection for.col
iten Iterate java.util.Enumeration for.enum
iter Iterate Iterable. Array in J2SDK 5.0 syntax for.each
itit Iterate java.util.Iterator for.it
itli Iterate elements of java.util.List for.list
ittok Iterate tokens from String for.st
itve Iterate elements of java.util.Vector for.vec
ritar Iterate elements of array in reverse order for.rev

NetBeansの場合,ループ系は「forc, fore, fori」となってる(その方が賢明)。


なんだかんだで,よく使うのはこいつら(むしろ,これしか覚えられなかったと言うのが正解)。

serr Prints a string to System.err
sout Prints a string to System.out
soutm Prints current class and method names to System.err
soutv Prints a value to System.out

うーん,もうちょっと使いこなしたいな。>Live Templates