競技プログラミングで使えるEclipse tips

この記事はCompetitive Programming Advent Calendar Div2012の第24日目の記事として書かれているものです。

自分は競プロでJavaを使っています。環境はWindowsEclipse Java EE IDE for Web DevelopersのIndigo(3.7)です。
競プロにおいて、無意識に当然のように使っているEclipseのコマンドやショートカットをまとめたらいい感じの記事になるんではないか、と思ってこれをネタにしてみました。うまくショートカットを使うと、コーディングの時間が短縮できたりして有利になりますね。
自分は今Indigoですが、他のバージョンでも同じコマンドが使えると思います。なお、MacLinux版のEclipseではコマンドが違うかもしれませんので、その時は適宜読みかえてあげてください。

地図

この記事で登場するコマンドや機能やその他tips一覧です

機能 コマンド
補完 Ctrl + Space
import自動編成 Ctrl + Shift + O
ソースのクイックメニュー Alt + Shift + S
リネーム Alt + Shift + R
自動インデント Ctrl + I
コメントアウト切り替え Ctrl + /, Ctrl + 7
クイックフィックス Ctrl + 1, F2
1行移動 Alt + ↑, Alt + ↓
行削除 Ctrl + D
行番号の表示 ???
テンプレート ???

補完 (Ctrl + Space)


この機能を知っていればもう他のコマンド要らないんじゃね?っていうぐらい超重要な機能だと思っています。これが無かったらJavaとか書いてられない。

この補完コマンドを打ち込んだ時のカーソルの位置に対応する補完候補がいくつか上がります。挙がった候補から矢印でキーワードを選択すれば補完が実行されます。候補が多すぎる場合は更に入力を続けて、候補を絞ることが出来ます。登場するキーワードは、変数、クラス名、メソッド、Java予約語、などなどほとんどのキーワードが対象です。また、後々説明するテンプレート機能に関係しますが、デフォルトで登録されているテンプレートコマンドも補完のキーワードに挙がります。有名どころでは、mainとかsysoutですね。以下にいくつかスナップショットを置いておきます。

1. 何もないところで、「main」と打ち込み補完を押せば、「public static void main(String...args){}」というキチガイに長いmainメソッドが作られます。

2. 答えを出力するときなどに使うSysout.out.println();も、「syso」まで打ち込んで補完コマンドを打てば一発です。「sys」までだと候補が複数あるので一発補完されません。

3. よく使うScanner等も、「scan」程度まで打ち込んで補完しましょう。このとき、自動でimport文が追記されるのでとっても便利。

4. Edgeクラスを作って重みでソートしたい!みたいと思ってEdgeにComparableインタフェースをimplementsしたとき、compareToメソッドを実装する必要がありますが、空っぽのEdgeクラス内で補完を押すと、未実装のメソッドも候補に挙がります。なお、「implements」というキーワードも補完できます。「im」くらいまで打って補完すればOKです。

import自動編成 (Ctrl + Shift + O)


import文の整理ができます。importされていないクラスがあれば、候補をいくつかあげてくれるし、使われていないクラスがimport文があれば削除してくれます。上述した通り、補完をバシバシ使えばimportされていないクラスというのは出てこないかと。どちらかといえば要らないimport文を消して綺麗にするというのが目的で使われるんではないでしょうかね(競プロは)。下のように、黄色いラインが引かれたクラスは使われていないものなので、ここでCtrl+Shift+Oを押せばArrayListの1行が消されます。なお、カーソルの位置はどこにあっても構いません。

ソースのクイックメニュー (Alt + Shift + S)


Eclipseメニューの「ソース」or「Source」タブの中にあるメニューをバッと出してくれるコマンドです。このメニューの中には、「フィールドを使ってコンストラクタの自動生成」「equals(), hashCode()のオーバーライド」などがあります。
例えば、メンバが3つあるクラスを作ったときにそのクラス内でクイックメニューを出し、「Generate Constructor using Fields」を選ぶと、

というウィザードになります。ここから、必要な変数についてのみチェックを入れると、

選んだ変数について初期化が行われるコンストラクタが自動生成されます。

リネーム (Alt + Shift + R)


リネームしたい変数やクラスにカーソルを合わせてコマンドを押せばリネームできます。

自動インデント (Ctrl + I)


カーソルのある行、もしくは範囲選択に引っ掛かっている行全てを自動インデントします。次のようにインデントがラリってる場合があるとします。

a[i]の行にカーソルを持って行ってCtrl + Iでインデントされます。

なお、インデント対象の行のすぐ上まではインデントが正しいと解釈されるので、次のように2重ループの最内側だけをインデントすると悲しい結果になります。

こういうこともあるので、範囲をでっかくとってインデントしましょう。Ctrl + Aで全選択してからインデントと覚えてもいいかもしれません。

他に、Ctrl + Shift + Fでフォーマッティングしてくれる機能もあります(自分は使ってませんが)。

コメントアウト切り替え (Ctrl + /) or (Ctrl + 7)


カーソルのある行、もしくは選択範囲に引っ掛かっている行の行コメントをon/offします。対象範囲にコメントアウトされている行とされていない行が混在している場合、コメントアウトする動作となります。

クイックフィックス (Ctrl + 1) or F2


何かしら文法的なバグや警告がある場合、その箇所にカーソルを運んでコマンドを押すと解決策の候補を挙げてくれます。

↓ここでCtrl + 1を押すと

候補がでてくる。あとは選ぶだけ。

Setの配列とか宣言したときに出てくる良く分からない警告

クイックフィックスメニューからなんか適当に選べば

警告を無視するためのアノテーションを付けてくれます

1行移動 (Alt + ↑)(Alt + ↓)


カーソルのある1行、もしくは選択範囲に引っ掛かっている行全体を移動させます。

行削除 (Ctrl + D)


カーソルのある1行、もしくは選択範囲に引っ掛かっている行全体を削除します。

行番号の表示


たぶん、デフォルトだと、行番号表示はOFFになっているんじゃないかなと思います。

OFFの場合、どうやって表示させるかというと、上の図の行番号が表示されるエリアで右クリックすればメニューに出てきます。

テンプレート


よく使うプログラム片を登録させ、キーワードを自由に設定することができます。設定したキーワードを打ち込んで補完を書けると、登録したプログラム片が張り付けられます。更に、特別な命令を埋め込むことによって、補完後にカーソルをどこに合わせるだとか、補完ついでにimportさせるとか、色々できます。

これを設定する場所は、「Window」->「preferences」->「Java」->「Editor」->「template」で辿りつけます。デフォルトで設定されているテンプレートがいくつか入っています。mainとかsysoutとかですね。
自分で定義するには「New」ボタンを押します。

「Insert Variable」で特殊な変数が色々使えます。「Cursor」を選ぶと、「${cursor}」という式が登場します。これは、補完後にこの位置にカーソルを合わせるという意味を持ちます。そのほかは色々調べてみてください。

自分は、Mainクラスを作ってから、run()を生成し、run()内にカーソルを合わせるためのテンプレート

だとか、
Project Eulerの最初の方でアホみたいにでてくる素数問題で使うエラトステネスの篩を生成する

とかを登録しています。
ライブラリを移すときに、コピーペーストでやるのではなく、テンプレート登録しておくともしかしたらコーディングが速くなるかもしれませんね。

テンプレート機能は、ICPCのような事前の電子的準備ができない大会では使えない子になっちゃうかもしれないですね(デフォルトのmain、sysoutは使えます)。

まとめ

競プロで使うEclipseの機能やコマンドを思い出せる限り列挙しました。
これでコーディングの手間を省いて、解法を考える時間が増やせたらいいんでないかなーっと思います。

明日は最終日、大トリはnodchipさんとli_sakuですね!