全Eclipse Java プログラマーに捧げる Eclispe 徹底活用術完全版〜Eclipseに空気を読ませて楽する術〜

この記事は、http://d.hatena.ne.jp/higayasuo/20090612/1244772658 の「Ctrl+1とCtrl+Spaceうんぬん」の話にインスパイアされて書いた。Eclipse可愛いよ。Eclipse
記事長いから、さくっと読み飛ばして、アニメーションgifがあるところから読んでも十分訳にたつと思う。
あと、新人さんとかに写経させるのもいいかも。というか、半分ぐらいうちの新人に勉強のためと思って書いたから。で、実際に写経させて役にたった。


JavaEclipse などの IDE も含めて言語というか、環境というか…だと僕は思ってる。Commons, Maven なども含めたい(まぁ、そのあたりは、CPANも含めてperlだろ。とか、これは否定する人だらけだろうけど、Railsrubyということを言う人もいるよね)。


少なくとも僕は、Eclipse を使うと格段に生産性が増す。また、現在のEclipse は操作方法について多くを覚える必要はない。基本的には、次の2つのショートカットキーを覚えれば生産性が格段に増す。


- Ctrl + 1
- Ctrl + Space


簡単に説明すると、Ctrl+1 は Eclipse に空気を読んでもらって「あなたはこういう事がしたいんじゃないですか?」と提案してもらう機能。Ctrl + Space は空気を読んだ補完をしてもらう機能だ。
Eclipse の空気読む能力はすばらしい。たまに Eclipse に俺は監視されてるんじゃないかと悩むときがあるぐらい。


そんな与太話は置いておいて、実際の Eclipse の生産性の高さを、足し算引き算などを行うCaluculatorクラスをTDDっぽく作成しながら説明しようと思う。上記2つのショートカットキー以外で便利なものも説明する。


この先の説明は以下の plugin を前提として説明するので、もし、この記事を見ながら同じことを試してみようと思う人は、入れておいてほしい。
- QuickJUnit (http://quick-junit.sourceforge.jp/)


JUnit4.x系でテストを実行してるので、以下から JUnit の最新をダウンロードしておいてほしい。
JUnit4 と hamcrest の使い方は調べて欲しい。今時はJUnit4系が普通ですよ。
http://sourceforge.net/project/showfiles.php?group_id=15278&package_id=12472


Eclipse に 次の設定も行っている。Preference(設定)の画面から。(Special Thanks Yoshiori. http://d.hatena.ne.jp/Yoshiori/20090417/1239959004)

  • [Java]-[Editor]-[typing] で Automatically insert at correct position の Semicolons, Braces にチェック
    • どこで「;」と「{」と「}」押しても行末にいれてくれる
  • [Java]-[Code Style]-[Organize Imports] の Number of static imports needed for .* を 1 にする
    • import static org.junit.Assert.* を展開しないように


さらに以下の設定も行う(設定多すぎるかw)

  • [Java]-[Editor]-[Templates] の Name が [Test] のものを選択して[Edit]を選んで元が以下のものを
@${testType:newType(org.junit.Test)}
public void ${testname}() throws Exception {
	${staticImport:importStatic('org.junit.Assert.*')}${cursor} 
}


この記事の後のほうでも説明するが、テンプレート出力時に、hamcrest の Matcher も static import されるように以下のように編集する。

@${testType:newType(org.junit.Test)}
public void ${testname}() throws Exception {
	${staticImport:importStatic('org.junit.Assert.*', 'org.hamcrest.CoreMatchers.*')}${cursor} 
}


以下からは、実際の操作の説明。画像省略となっている箇所は、かなりはしょっているので、わからない人がいたらコメントくれれば画像か説明を足す。また、ショートカットキーのキーバインドはWinのもの。linux系は一緒だと思う。Macは割と違うので、俺のメモも参照 http://d.hatena.ne.jp/Yamashiro0217/20090418/1240023547

Java プロジェクトを作成する

まずは Java プロジェクトを作成しよう。Eclipse 上で、Java プロジェクトを作成するには、「Shift+Alt+N」を使う。Javaプロジェクトに限らないが、よく新規作成をするものはここから作成することができる。


「Shift+Alt+N」から出てきたダイアログから、[Java Project]を選択しよう


選択すると、Javaプロジェクト作成ウィザードが開くので、プロジェクト名をきめて作成する。今回の例では「計算」というプロジェクト名とした(画像は省略)。

Testクラスを作成する

次に、Testクラスを先に作成しよう。Testクラスの作成も「Shift+Alt+N」を使う。

「Shift+Alt+N」から出てきたダイアログから、[JUnit Test Case]を選択する。


JUnit Test Case ダイアログが開く。今回は JUnit4 で作成するので、一番上のラジオボタン「New JUnit 4 test」を選択し、パッケージを「calc」を入力し、Nameに「CalculateTest」を入力する。


結果として JUnit の Test クラスが作成され、エディタが開く(画像は省略)。

Test メソッドを作成する

Testクラスに Testメソッドを作成しよう。Testメソッドを作成するには、クラスの内部で、「Test」をうち、「Ctrl+Space」を押す。
すると、補完候補が出てくる。補完候補の中に、「Test - test method(JUnit4)」というのが出てくるのでそれを選択すると、テストメソッドの雛形が作成される。


これは、Eclipse の template の機能である。前述で、[Templates]の[Test]の編集を行ったのは、テストメソッドの雛形生成時に、hamcrest の import も出るようにである。template は自由に編集できるし、また、可変にする場所などもいじれるので、自分のプロジェクトに特化するように編集、新規作成すると生産性が向上する。


templateの機能で、僕が一番使うのは、「sysout」だ。このテンプレートを使うと、sysoutで[Ctrl+Space]すれば「System.out.println()」が出力される。


Test メソッドのテンプレートでは、testnameが可変になっているので、そのままテスト名称を変更する(この例のテスト名称は非常にダサいことは認識ずみw)。

Package Exploerer View に移動する(Ctrl+3の活用)

この状態のままだと、JUnit の最新のjar がクラスパスにないので、コンパイルエラーになっている。これを解消するために、Package Exploerer View に移動して、JUnit の jar をクラスパスに通す作業を行おう。


Package Exploerer View に移動するのに、Ctrl+3 を利用しよう。Ctrl+3は、View や、Menu などに Quick Access するためのアクションへのキーバインドである。実際に使っているところを見てみよう。以下のようになる。


Package Exploerer Viewに移動したので、「BackSpace」で、選択を状態を上に移動できるので、これを使って、プロジェクトを選択している状態にして、プロジェクトのプロパティを表示させるキーバインドである[Alt+Enter]を実行しよう。(ここからはさすがにマウス使ったほうが早いと思う)[Java Build Path]を選択し、[Libraries]タブから[Add External JARs]で JUnit の最新版の jar をクラスパスに含めて、もともとの Eclipse 標準の JUnit4 をはずす。以下のような状態になっていれば大丈夫である。


テストクラスのエディタに戻ろう。Ctrl+3で Quick Access ダイアログを開き、「test」などと打つと先頭に「CalculateTest」が選択肢にあらわれるので Enter を押す(画像省略)。


Ctrl+3は本当に便利で、たとえば、Ctrl+3 の機能から、Preference にもアクセスすることができる。たとえば前述の[Organize Imports]の設定を変えたいときには、[Ctrl+3]を押して、出てくるダイアログで「Org」ぐらいまで打つと、選択肢が減るので、「Preferences]-[Organize Imports]を選択すれば設定画面を表示することができる。

assert文を書くことで、テストメソッド内のフィールド、Calcurator クラス、add メソッドを Eclipse に空気を読ませて作成させる。

これから作成するCalculatorクラスに対する assert文を書く。まず、Calculatorクラスに add という、第1引数と第2引数に渡した値を足し合わせて返すようなメソッドがあると想定して assert 文を書くと以下のとおりとなる。適宜、Ctrl+Spaceを押して補完している点も見て欲しい。また、前述した[typing]の設定により、途中で「;」を押したときに文の最後にセミコロンが入力されることも注目して欲しい。

この状態で(エラーのある行で)、[Ctrl+1]を押すと、Eclipse が空気を読んでくれる。いい感じに読んでくれる。上から選択肢が「calculator というローカルフィールドを作りますか?」「calculator というインスタンスフィールドを作りますか?」「calculatorというメソッドの仮引数を足しますか?」…ect というものだ。ここでは、ローカルフィールドの作成を選択する。

慣れてくると、「Eclipseさんきっとこういう提案してくれるますやろ?」ってのが感じられるので、選択肢から選ぶというより、指がそれを選んだりする。



自動生成されたコードのクラスだったり変数名をそのまま変更できるので、Tab を押して「Object」となっているクラス名を変更し、Enterを押す(本来は、Escを押して、そこでカーソルをとめたほうが早いのだが、この先の説明のために、Enterでカーソルををassert文のある行に戻す)。


今の状態だと、カーソルがエラー行にない。エラーのある行で Ctrl+1を押すと Eclipse が空気を読んでくれるので、エラーのある位置まで飛びたい。エラーのある位置まで飛ぶには、[Ctrl+,]または[Ctrl+.]を使う([Ctrl+<],[Ctrl+>]と表記したほうがいいのかも。だけどShiftは押さない)。


エラー行にジャンプするのがわかりやすい説明のために、画面キャプチャは3行ぐらい空白がある状態にした。で、[Ctrl + ,] で前のエラーに飛んで、Ctrl+1を押してみる。押すと、「クラス作る?インタフェース作る?それともゴハン?それともワ・タ・シ…etc」と聞いてくれるので、「Create class Calculator」を選択してクラス生成ダイアログを開いてクラスを作成する(クラス作成ダイアログの画面は省略)。




クラス生成ダイアログでクラスを作った後は、作成したクラス(Calculator)にエディタのフォーカスが合うが、もとのクラスに戻りたいので、いずれかのショートカットを使って戻る。Quick JUnit を入れてあるので、Quick JUnit の機能である「テスティングペアを開く」機能で戻ってみよう。ショートカットキーは「Ctrl+9」である。


押すと、以下のようなダイアログが出るはずである。


Quick JUnit は「Hoge」からペアを開くときには「HogeTest」を探すようになっている(ルールは設定で変えられるが)。今、我々が作ったクラスは、「Calculator」と「CalculateTest」であるので、クラスが存在しないので、作成するかどうか Quick JUnit が聞いてきてくれたのだ。これは非常に便利な機能だが、今回の目的には使えないので、「Cancel」ボタンを押すか、Escしておこう。


では、どうやって、CalculateTestのエディタに戻ろう?方法はいくつかある。たとえば、[Ctrl + 3]で、Quick Access を開く方法、[Ctrl + E] で現在開いてるエディタから選択する方法、[Ctrl + Shift + T]でクラス名を指定して開くダイアログを表示させる方法、[Ctrl + Shift + R]で、クラスに限らずあらゆるリソース(ファイル)を指定して開く方法などがある。これらを一通り試してみて欲しい。


僕だったらこの場合は、[Alt + ←]で戻る。この機能は、前回触っていた部分に戻る。という機能だ。逆に進みたいときは、[Alt + →]が使える。操作箇所の移動に対する、Undo/Redo だと考えてもらえばよい。


[Alt + ←]で戻ったら、add メソッドのところでコンパイルエラーになっている。当然である。作っていないのだから。カーソル位置から、[Ctrl+.]でaddがエラーになってる位置まで行って、[Ctrl+1]を押すと、「メソッド作らないか?うほっ」と Eclipse 君が気を使ってくれるので作成しよう。戻り値の型が Object になっているが、さてどうしよう。簡略化のために、int の間の足し算だけできると過程して、タブを押して移動して int に変えておこう。ついでに、return null; を return 0; に変更しておこう。


この時点でまだコンパイルエラーが残っているようだ。CalculateTest に戻ってみよう。「calculator」でエラーになっているようだ。[Ctrl + 1]を押すと「Initialize value」つまり変数が初期化されていないというエラーなので、実行して、さらに、コンストラクタを呼ぶように書き換えよう。このとき、[Ctrl + Space]で補完させることを忘れてはならない。

テストを実行する

これでコンパイルエラーは全てなくなったはずである。さてテストを実行しよう!どうやって実行するかというと、Quick JUnit の機能を使う。[Ctrl + 0]を押すことで、テストを実行することができる。テストメソッドのなかにいる場合は、そのテストだけを実行。メソッドの中でない場合は、テストクラス全体を実行してくれる。また、[Ctrl + Shift + 0]を実行することで Debug 実行を行える。


さて、テストをすると、以下のようなエラーとなるはずである。

それもそのはずである。return 0; しているのであるから。とりあえずここでは、return 8; をしてテストを通すようにしよう(余談だがこれを TDD で言うところの明白な実装と言う)。add メソッドの実装の中にジャンプするにはどうすればいいだろう。add までカーソルを持っていき、F3を押すことで、add メソッドに飛ぶことができる。マウスを使っているときは、Ctrlを押しながら、メソッド名を左クリックすることでそのメソッドの中身にジャンプすることができる。

さて、これでもう一度テストメソッドに戻ってテストを行うとテストが通るはずである。

リファクタリングを行う

最後に、リファクタリングを行おう。例えば add メソッドの名前を変更してsumに変えてみよう。add メソッドの呼び出し部分で、[Alt + Shift + R]でその場で名前を変更することができる。

このようにして、その場でメソッド名を変更することができる。このとき、当然、Calculator.java のメソッド名も sum になっている。


今回はTDDの勉強ではないので、プログラムはここまでとする。

まとめ

いかがだったろうか、Eclipse がかなり空気の読める子だというのがわかったのではないだろうか。
いかに Eclispe に気を使わせるか。というのがストレスなく Java でプログラムを書くのに重要じゃないかと僕は考える。


今回は [Ctrl + Space] の空気の読みっぷりの紹介が少なかったが、たとえば AuthenticationNotSupportedException のフィールドを定義しようとしたときに、クラス名は当然補完が利くとして、フィールド名も[Ctrl + Space]を押すことで、以下のように空気を読んでくれる。


このように変数名の候補を、いろいろ空気を読んで補完しようとしてくれる。Eclispe 君すごすぎる!


紹介しきれなかったが、僕は以下のキーバインドを多用している。他にも有用なキーバインドがあったら教えて欲しい。また、Ctrl + 1 の機能を拡張したり Ctrl + Space の機能を拡張ってプラグイン開発でできるのか教えて欲しい。

  • Ctrl + Shirt + G
    • メソッド名とかクラス名とかにカーソルがあった状態でこれを実行すると、そのメソッドやクラスを利用してる他の場所の一覧を検索できる
  • Ctrl + H
    • 検索ダイアログ表示
  • Ctrl + M
    • View の最大化/普通化のトグル
  • Ctrl + O
    • エディタ上で実行するとメソッドなどのアウトラインが表示されて絞り込んで jump することができる
  • Ctrl + T
    • インタフェースのメソッド名とかで実行すると、そのメソッドを実装している実装クラスの一覧などが表示できる
  • Shiht+Alt+Sしてでてくるダイアログ
    • settter/getter出力のダイアログを出してくれる
  • Ctrl+J(とCtrl+K)
  • Ctrl+Shiht+O
    • Orgarnize Import(自動でクラス探して import してくれる) のショートカットなんだけど、セーブ時に自動でやってくれる設定にしてるのであんまり使わない
  • 選択した状態で Alt+↑ , ↓
    • 選択した行にあるコードを移動できる。TODO これは動き見せたほうがいいかも。
  • Ctrl+D, Ctr+Shift+D
    • 一行削除、カーソルから行末まで削除
  • Ctrl+I
    • 選択行をインデント
  • Ctrl+S
    • 基本すぎて書くの忘れてた。セーブ
  • Alt+Shift+Q
    • Ctrl+3 とかで package exploerer view に移動する代わりに、よくつかいそうな view ならこれでポップさせた後に、Package なら P をうてば移動できる。俺はあんまりつかわなそうだけど。Special Thanks shin1ogawa
Alt+/

実はここ最近入ったショートカットというか機能の中で僕の一番のお気に入り。例えば

String internationalization = …;
 ・
 ・
 ・
String foo = "i…

ってコードがあったときに、fooにinternationalization って文字列を代入したいときに、文字列の途中で補完はきかない。なぜならjavaコンパイル単位の要素ではないから。だけど、"i の時点で、Alt+/を使うと、iから始まる単語の文字列を開いてるエディタ群の中から探してきてくれる。つまり、internationalizationを補完してくれる。



あ。あと、ショートカットキーを覚えるのに、Mouse Feed っていう Eclipse Plugin いいよ!これは、マウスで操作したときに、non strict モードだと、マウス操作のショートカットキーを教えてくれる。strict モードだとマウス操作が実行されないで、ショートカットキーを教えてくれる(代わりにそっちで実行せよってこと)。
http://www.mousefeed.com/


最後に今回の記事を最初から最後まで操作した画像を入れておく(途中で、なんか JUnit3 のにはまったのは無視してください。もう一度通しで撮影しなおす気力がないw)。Java Build Path の設定の箇所以外はマウスを使ってないです。