164


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

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

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

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


CC BY-SA 3.0
2014-10-01T16:30:57.317
73
2014-12-29T03:13:02.883
2014-12-29T03:13:02.883
30
30
question
emacs
EmacsをJava用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
の機能を利用したほうが良いと思います。


CC BY-SA 3.0
2014-11-12T18:29:59.293
164
2014-11-12T18:29:59.293
82
73
answer


CEDET <http://cedet.sourceforge.net/> はどうでしょうか。 1.~4.は実現できると思います。
（残りもいくつかは実現できると思います）


CC BY-SA 3.0
2014-12-16T07:36:53.147
1704
2014-12-16T07:36:53.147
3552
73
answer


Android Studio/IntelliJとあるので、Javaを前提としますが、一番メジャーなのはmalabar-modeでしょうか。
導入はかなり面倒です。

CEDETの拡張でJDEEというのがありますが、開発停止しており・・・と思ってましたが再開されたようです。 こちらを試してみてもいいかもしれません。

<http://mikio.github.io/article/2012/12/23_emacsjdeejava.html>


CC BY-SA 3.0
2014-12-16T08:03:55.730
1708
2014-12-16T08:03:55.730
2542
73
answer


# 適切なスコープだけ編集

適切なスコープだけ編集したいのであれば、narrowing系コマンドを駆使すればいいと思います。

まず最初にnarrowing系コマンドでパニックにならないように、解除方法である `C-x n w` (`M-x
widen`)を覚えてください。このコマンドが最重要です。

narrowingとはバッファの特定領域だけを編集範囲にするものです。表示もその特定範囲だけになります。基本はリージョンを選択して`C-x n n`
(`M-x narrow-to-
region`)です。そうすると選択範囲以外は消えてしまいます。表示上消えただけです。narrowingを解除すると現れるので大丈夫です。

このnarrowingの状態ですと表示されている領域しか編集対象になりません。置換なんかもこの範囲内です。編集を終了したら前述の`C-x n
w`で元に戻してください。

ちなみに初めてnarrowing系コマンドを使うときは「本当に大丈夫か?」みたいなことをEmacsが聞いて来ます。これはこのコマンドを知らないとパニックを起こすためです。narrowing系コマンドは他に、

  * `narrow-to-defun` (カーソルのある位置の関数・メソッド定義)
  * `narrow-to-page` (`^L`で挟まれた領域。elispはこれでページを分けたりしているようです)

があります。カーソルのある位置のクラス定義全体を編集範囲にしたいときは

  1. `C-M-u`を何度か押してクラス定義の先頭にカーソルを持って行く
  2. `C-M-space C-x n n`でnarrowing
  3. 心ゆくまで編集し
  4. `C-x n w`でnarrowing解除

という手順になります。`C-M-u` (`M-x backward-up-list`)はブロックを遡る
(押すたびに一つ上のレベルのブロックにカーソルが移動する)、`C-M-space`(`M-x mark-sexp`)
はブロックをマークするというもので覚えておくと便利かと思います。

ただし、`narrow-to-defun`や`mark-sexp`や`backward-up-
list`はメジャーモードが対応していないと使えないかもしれません。lisp-modeとruby-modeで使っていますのでこれらモードでは動きます。

もうひとつ、リファクタリングにはmultiple-cursorsパッケージが有用かと思います。

# メソッドの切り出し

これは`C-M-k`(`M-x kill-
sexp`)と前述の`C-M-u`を駆使しましょう。`C-M-u`でメソッドの先頭に持って行って、`C-M-k`です。

あるいは`M-x mark-defun`の後に`C-w`でもよいかと思います。


CC BY-SA 3.0
2014-12-17T12:41:57.373
1922
2014-12-17T12:55:56.067
2014-12-17T12:55:56.067
3413
3413
73
answer


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

Auto complete mode(<http://cx4a.org/software/auto-complete/index.ja.html>)
はいかがでしょうか? GNU Global(<http://www.gnu.org/software/global/>)
のタグを情報源に補完できるので、完璧とはいえませんが、そこそこ快適にコーディングできると思います。


CC BY-SA 3.0
2014-12-28T19:17:36.870
2760
2014-12-28T19:17:36.870
5727
73
answer