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

Day 11: コードナビゲーション(http://matarillo.com/resharper/day11.php

「Navigate From Here」コンテキストメニュー

ReSharperのすごい所に、コンテキストメニューが1つ以上あるってことがある。

なぬ?IDEAにゃ,そんな機能はないぞ。


ReSharperや他のJava IDEにも負けず劣らず,IDEAにはこれでもかというほど豊富なナビゲーションコマンドがある。前述した「Goto Class(Ctrl+N)」「Goto File(Ctrl+SHIFT+N)」「Goto Symbol(Ctrl+ALT+SHIFT+N)」の他に,宣言部に移動する「Goto declaration(Ctrl+B/Ctrl+Click)」,実装部に移動する「Goto implementation(Ctrl+ALT+B)」。残りを全部挙げると,こんなにある。

  • Goto type declaration(Ctrl+SHIFT+B)
  • Goto super-method/super-class(Ctrl+U)
  • File structure popup(Ctrl+F12)
  • Type hierarchy(Ctrl+H)
  • Method hierarchy(Ctrl+SHIFT+H)
  • Call hierarchy(Ctrl+ALT+H)

いっぱいあるのをひけらかしたところで,使いたいときにサクって使えなかったら意味無いじゃん(こんなにショートカットキー覚えられん)。結局の所,よく使う機能だけショートカットキーを覚え,それ以外は毎回メニューを選択するといった,ちょっと屈辱的な事をしてた。
なんで,ReSharperのこの機能はとってもうらやましいぞ。


しかし,あたしは気がついた。


IDEAのキーカスタマイズにはQuicklistちゅう,お好きな機能をひとまとめに出来るモノがある。コレ使って,ReSharper風のこと出来ないかなぁと思って試してみたら,思いのほか簡単にできた。

#これが,Settings→KeymapにあるQuick listsの設定画面。


作ったQuicklistには起動キーを設定できるので,「Ctrl+ALT+G」を割り当ててみると,ご覧の通りの結果となった。


こりゃいいな。Quicklistって何に使うんだろ?ってずーっと使ってなかったけど,初めて便利だと思った。
気づかせてくれて,ありがとう。>id:matarillo

サイドバーアイコン

サイドバーね。限りなくどうでもいい事だが,IDEAのエディタウィンドウの左端部分は「ガーター(Gutter)」と言うらしい。なんでま,サイドバーアイコンというよりガーターアイコンと言うべきなのだろう。
#まったくもって,どっちでもイイ。


ガーター部分にはブレイクポイントやブックマークなども表示されるんだけど,ナビゲーションに関わりありそうなのは,この4つ。


って,スクリーンショットは2つしかないけど,それぞれ矢印が下向き(↓)バージョンがあるので,全部で4つ。


「O」と「I」ってあるけど,前者はオーバライドで後者はインプリメント。矢印が上向き(↑)なのは,「してる側」だから。似たようなアイコンはNetBeansにもEclipseにもあるし,機能も同じだから,押したら「された側」にジャンプするのも分かるでしょ。


下向きの矢印(↓)は「された側」に付く。これも押すと「してる側」に移動すんだけど,上向きと違って複数候補があがるから,好きなの選んでジャンプすればいい。


ちょっと見たところ,この下方向への移動はIDEAでしか見かけなかった。NetBeansEclipseにもあると思ったら,まだ無いのね。ちょっと鼻高々。:-D
このReShaperの人は,めったに使わないって言ってるけど,あたしゃ結構よく使う。特に下方向を重宝してる。
だって,誰かが継承・実装してるのが一目瞭然なんだもの。コードリーディングするときなど大活躍だ。

宣言へ移動

これはもう空気を吸うくらい自然に使っている。元いた場所に戻る「Back」と組み合わせると,気分はWebブラウザと変わんない。
それに,この機能はIDEAの専売特許ってわけじゃないので,Eclipseは当然のこと,NetBeansJDeveloperにだってある。


そんな珍しくもないこの機能にあえてコメントしてるのは,ちょいとした自慢ポイントが2つあるからだ。
その一つは,以下のようにキーカスタマイズしてること。

  • Goto declaration(Ctrl+])
  • Back(Ctrl+T)

...vim使いじゃないと伝わらないぞ。


もいっこは,MouseGesturesを入れて「←」ジェスチャに「Back」を割り当ててること。
元々,中クリックが「Goto declaration」に割り当たっているんで,マウスジェスチャが入るとなお便利になる。


あとは「Quick Definition Lookup(Ctrl+SHIFT+I)」で快適コードナビゲーションって寸法だ。

おまけ:ファイル操作

31日間ReSharper一周のメニューにもないし,誰かが書かないと気づかないので,あえて書くがIDEAのファイル操作はかなりヒドイぞ
特にEclipseのパッケージ・エクスプローラが便利だと思っている人が,IDEAのプロジェクトウィンドウを使ったら「このIDE,なんで絶賛されるのか,さっぱりわからん」と思うだろう。そんくらいなっちゃ無い。


まあ確かにEclipseのそれが出来すぎてるってのもある。Windowsエクスプローラ間でドラッグ&ドロップできるし,WordやExcelのファイルも平気で開くしね。でも,それを差し置いてもIDEAのソレは劣っているって言わざるを得ない。
なにせ,プロジェクトウィンドウ内でファイルをドラッグ&ドロップで移動することすら出来ないんだもの。イマドキ,そんなUIあるかよ?

#これがファイル操作に,まったく向かないプロジェクトウィンドウ。


んじゃ,どうやってたかって?


フツーのファイルを移動したりリネームしたりするのもリファクタリングの「Move」やら「Rename」やらを使っていたのだ。これって,ちょっとあんまりでしょ。:-D
一応,IDEA7から「Move」リファクタリングは,ドラッグ&ドロップでも出来るようになったんだけど,今のところ掴めるのはJavaファイルだけみたい(正式版でどうなるかは知らない)。


それにファイル操作を行うためにCommanderというFDみたいなツールウィンドウがあるんだけど,操作感がイマイチなので,今まで一度も使ったこと無い。

#UIにイマサラ感が漂うCommanderウィンドウ。


そんなこともあって,何でもかんでもIDEでやるこたないだろうと,ファイル操作はエクスプローラでやることにしてる。プロジェクトウィンドウ自体も「その程度」の扱いなので,普段は閉じといて必要なときだけ引き出して使うクセが付いちゃった。


なお,最近,FileBrowserという,ずいぶんマシなファイルブラウザが登場したが,今となってはIDEAでファイル操作する気にならないので,入れたはイイがHDDの肥やしになっている。

Day 12: 型階層の表示(http://matarillo.com/resharper/day12.php

どうも,ナビゲーション系に関しては原著者と気に入る部分が異なるようだ。それは言語特性(C#/Java)によるものなのか,組むコードの特性によるものなのか,利用者の能力によるものなのかは分からない。
#多分,一番うしろのがアタリだ。


ともかく「型階層の表示:Type hierarchy(Ctrl+H)」だ。IDEAにもReSharperとまったく同じ機能があるが,ほとんど使ったことはない。
言われてみればインターフェイスにしろ親クラスにしろ,実装(継承)してるクラス群を,子どもはおろか,末代まで辿ってくれるのでコード解析などではとても重宝しそうではある。でも,IDEA使い始めて3〜4年経つが,この機能を便利だと思ったことは一度もない。


似たような機能で,メソッドを基点に継承関係を表示する「Method hierarchy(Ctrl+SHIFT+H)」ってのも使ったこと無い。どこの誰がオーバーライドしたのか分かるようなんだけど,そうゆう用途がそもそも無いので結局使っていない。:-D


でだ,階層系で一番使うのは,なんてったってコレだ。
「Call hierarchy(Ctrl+ALT+H)」
#ここで,ひみつ道具のジングル,どーん。


これも今となっては珍しくも何ともない機能なんだが,IDEA4.0の頃から大変重宝している。
それに,珍しくないといっても,IDEAのCall Hierarchyはインターフェイスの先も追えるんだぞ。

#2行目のListener.start()インターフェイスなんだけど,
#それを実装しているAjp13Listener, HttpListenerも追跡してくれる。
#ただし,HttpListenerを継承しているHttpsListener
#追跡できないけどネ。:-)


余談になるが,先の型階層は役に立たないといったけど,それはStructureウィンドウで大体の用を足せるため,Hierarchyウィンドウを開く必要がないといったほうが正しいかも知んない。
Structureウィンドウってのは,IDEによってはアウトラインビューとかプロパティインスペクタとか呼ばれるアレで,こんなふうに実装してるインターフェイスや,親クラスなんかを表示してくれる。


このStructureウィンドウ,IDEAらしい気の利いたことをしてくれる。それはプロパティって概念でグループ化してくれることだ。
ちょっとでもJavaBeansに手を出した人ならわかると思うけど,JavaBeansのプロパティは,結構いい加減なルールで成り立っている。要するにgetter/setterの命名規則からプロパティ名を決定するんだけど,このクセを知らないと自分が思い描いているプロパティ名と,実際にイントロスペクタが導き出したプロパティ名が異なる場合がままある。


でもIDEAの場合,StructureウィンドウにJavaBeansの規則に則ったプロパティ名を表示してくれるので,そんなワケ分からんことで悩まないでいい。

#ワザと変態ちっくな名前になるようにしたので,よーく見て欲しい。


JavaBeansのプロパティ名でハマるってのは,ハンガリアン記法みたいな,ちょっと変態入った命名規約を用いた場合くらいなんだけど,往々にして業務プログラムの命名規約はヘンチクリンなのだ。


んで,もともとプロパティ構文を持っているC#の場合,そんなアホなことで悩むことは無いだろうから,わざわざ取り上げられることもないんだろな。


ps.
http://journal.mycom.co.jp/articles/2007/05/16/java7/index.html