EmacsをJava用IDEとして使い倒せるパッケージはありますか?


ここ数ヶ月Android Studioのお世話になっており、よくできているなと感心しています。これまでEmacsが長かったのですが、Android
Studio/IntelliJと同等のことができるほどには使い込んでいません。

Android Studioでは以下の操作をよくしています。これをEmacsで実現できるようなIDEパッケージはありますか?
ひとまずJavaが対象ですが、多言語対応でも可です。

  1. 検索: ソースツリー内のファイルをファイル名から検索して開く
  2. 検索: ソースツリー内のファイルをファイルの内容から検索して開く
  3. 検索: メソッドや変数の定義に飛ぶ
  4. 検索: メソッドや変数、クラスを使っている行をソースツリー内から検索する
  5. リファクタリング: メソッドや変数、クラス名を任意のスコープ内で (メソッド内のみ、クラス内のみなど) 一気に変更する
  6. リファクタリング: その他リファクタリング全般 (メソッド切り出しなど)
  7. コード編集支援: クラス名やスコープ内の変数などから変数名を自動補完する
  8. コード編集支援: カーソルがある行をif文やtry/catch文などで囲う
  9. コード編集支援: カーソルがあるメソッドの引数名や型、返り値を表示する
  10. コード編集支援: 静的コード解析で見つかった問題を修正する (インポート文を自動挿入するなど)

更新: 範囲が広すぎたため、質問の方向をピボットして、全部を実現できるようなソリューションがないかを問う質問にしました。




>   1. 検索: ソースツリー内のファイルをファイル名から検索して開く
>   2. 検索: ソースツリー内のファイルをファイルの内容から検索して開く
>   3. 検索: メソッドや変数の定義に飛ぶ
>   4. 検索: メソッドや変数、クラスを使っている行をソースツリー内から検索する
>

helm <https://github.com/emacs-helm/helm>
というパッケージが検索というか絞り込みの操作全般をまかなう定番です。ソースツリー内のファイル検索はさまざまなやり方があると思いますが helm
と組み合わせるなら helm-ag <https://github.com/syohex/emacs-helm-ag> がいいと思います。

キー操作については、 helm
のインストール作業の一環として自分で好みのキーバインドを定義することになりますので、短くて打ちやすい（覚えやすい）キーバインドを使えます。

>   5. リファクタリング: メソッドや変数、クラス名を適切なスコープ内で一気に変更する
>

「適切なスコープ」がよくわかりませんが、リージョンを選択して M-x query-replace でも（原始的ですが）一括置換は可能です。が、

>   6. リファクタリング: その他リファクタリング全般 (メソッド切り出しなど)
>

こういうのは Emacs Lisp パッケージで実現するのは難しいのではないかと思います（探せばあるのかもしれませんが...）

>   7. コード編集支援: クラス名やスコープ内の変数などから変数名を自動補完する
>

これは限定的ではありますが標準機能の動的略語展開 (dabbrev-expand) で補完できます。変数名を途中まで打って M-/ を押してみてください。

>   8. コード編集支援: カーソルがある行をif文やtry/catch文などで囲う
>

私は使ったことがないのですが yasnippet <https://github.com/capitaomorte/yasnippet>
などを駆使すれば似たようなことが実現できるかもしれません。

>   9. コード編集支援: カーソルがあるメソッドの引数名や型、返り値を表示する
>   10. コード編集支援: 静的コード解析で見つかった問題を修正する (インポート文を自動挿入するなど)
>

5, 6 のリファクタリングと同様、静的なコード解析まで行う高機能な Emacs Lisp
は（探せばあるのかもしれませんが）思い当たるものがありません。過去に Ruby のコード解析を行う RSense
<http://cx4a.org/software/rsense/index.ja.html> というツールを使ったことがありますが、 RSense 自体は
Java で書かれていました（付属の Emacs Lisp パッケージのインタフェースを通じて Emacs から利用する）

私は Eclipse や Android Studio/IntelliJ などの IDE
に習熟していないので比較したわけではないですが、静的コード解析や自動リファクタリングのような機能は Emacs のカスタマイズをするよりも素直に IDE
の機能を利用したほうが良いと思います。




>   1. 検索: ソースツリー内のファイルをファイル名から検索して開く
>   2. 検索: ソースツリー内のファイルをファイルの内容から検索して開く
>   3. 検索: メソッドや変数の定義に飛ぶ
>   4. 検索: メソッドや変数、クラスを使っている行をソースツリー内から検索する
>

helm <https://github.com/emacs-helm/helm>
というパッケージが検索というか絞り込みの操作全般をまかなう定番です。ソースツリー内のファイル検索はさまざまなやり方があると思いますが helm
と組み合わせるなら helm-ag <https://github.com/syohex/emacs-helm-ag> がいいと思います。

キー操作については、 helm
のインストール作業の一環として自分で好みのキーバインドを定義することになりますので、短くて打ちやすい（覚えやすい）キーバインドを使えます。

>   5. リファクタリング: メソッドや変数、クラス名を適切なスコープ内で一気に変更する
>

「適切なスコープ」がよくわかりませんが、リージョンを選択して M-x query-replace でも（原始的ですが）一括置換は可能です。が、

>   6. リファクタリング: その他リファクタリング全般 (メソッド切り出しなど)
>

こういうのは Emacs Lisp パッケージで実現するのは難しいのではないかと思います（探せばあるのかもしれませんが...）

>   7. コード編集支援: クラス名やスコープ内の変数などから変数名を自動補完する
>

これは限定的ではありますが標準機能の動的略語展開 (dabbrev-expand) で補完できます。変数名を途中まで打って M-/ を押してみてください。

>   8. コード編集支援: カーソルがある行をif文やtry/catch文などで囲う
>

私は使ったことがないのですが yasnippet <https://github.com/capitaomorte/yasnippet>
などを駆使すれば似たようなことが実現できるかもしれません。

>   9. コード編集支援: カーソルがあるメソッドの引数名や型、返り値を表示する
>   10. コード編集支援: 静的コード解析で見つかった問題を修正する (インポート文を自動挿入するなど)
>

5, 6 のリファクタリングと同様、静的なコード解析まで行う高機能な Emacs Lisp
は（探せばあるのかもしれませんが）思い当たるものがありません。過去に Ruby のコード解析を行う RSense
<http://cx4a.org/software/rsense/index.ja.html> というツールを使ったことがありますが、 RSense 自体は
Java で書かれていました（付属の Emacs Lisp パッケージのインタフェースを通じて Emacs から利用する）

私は Eclipse や Android Studio/IntelliJ などの IDE
に習熟していないので比較したわけではないですが、静的コード解析や自動リファクタリングのような機能は Emacs のカスタマイズをするよりも素直に IDE
の機能を利用したほうが良いと思います。

