Emacs における快適な Ruby 開発環境を求めて

今日は Emacs で Ruby を編集する場合に是非知っておきたい便利なツールについて紹介したいと思います．紹介するツールは以下の 3種類 + 1 です．

- Smart Compile
- xmpfilter
- what_methods (anything-ruby-methods)

# Smart Compile
  [Smart Compile](http://emacswiki.org/emacs/SmartCompile) は Emacs からキーを叩くだけで編集中のファイルをコンパイル/実行できる elisp です．これは Ruby に限らず，様々な言語での開発に使用できます．

  Emacs には標準のコンパイル機能(M-x compile)があるのですが，これは残念ながら make -k を呼び出すだけとなっており，使用場面が限られてしまいます．C 言語であればこれでいいけど，Ruby であれば，「ruby [編集ファイル]」を呼び出したいです．Smart Compile を使用すると，プログラミング言語ごとに別々のコマンドを割り当てることができるようになります．

  C などではコンパイルだけを行いますが，Ruby は分割されたウィンドウに結果を表示してくれます．インストール方法は以下のとおりです．

  1. [smart-compile.el](http://www.emacswiki.org/emacs/download/smart-compile.el) をダウンロードして，ロードパスの通ったところに置く．
  2. 以下を .emacs に記述する．

```emacs-lisp
    (require 'smart-compile)
    (define-key ruby-mode-map (kbd "C-c c") 'smart-compile)
    (define-key ruby-mode-map (kbd "C-c C-c") (kbd "C-c c C-m"))
```

  これで，Ruby 編集中に C-c C-c を入力すると即座にそのファイルを実行して結果を表示してくれます．C-c c を入力すると，ミニバッファに実行するコマンドを入力した状態になるので，こっちは引数などを入力したいときにどうぞ．

  ![Smart Compile 実行画面](http://www.fastpic.jp/images.php?file=7328235544.png)

# xmpfilter
  [xmpfilter](http://d.hatena.ne.jp/keyword/xmpfilter) は Smart Compile よりも簡単に Ruby の実行結果を見ることができるツールで，rcodetools に付属しています．Ruby コードの行末に「# =>」を入れて xmpfilter を実行すると，その行の返り値を表示してくれます．また，標準出力もコードの末尾に表示してくれます．

```ruby
    10.times do |i|
      i                             # =>
    end
    
    a = (1..5).to_a                 # =>
    a.map! {|i| i * 2}              # =>
    
    p a
```

  のコードが

```ruby
    10.times do |i|
      i                             # => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    end
    
    a = (1..5).to_a                 # => [1, 2, 3, 4, 5]
    a.map! {|i| i * 2}              # => [2, 4, 6, 8, 10]
    
    p a
    # >> [2, 4, 6, 8, 10]
```

  となります．試行錯誤にはすごく便利! インストール方法は以下のとおりです．

  1. gem install rcodetools で rcodetools をインストール．
  2. rcodetools.el をロードパスが通ったところにコピー (/usr/lib/ruby/gems/1.9.1/gems/rcodetools-0.8.5.0 の中とかにあります)．
  3. 以下を .emacs に記述する．
     
```emacs-lisp
    (require 'rcodetools)
    (define-key ruby-mode-map (kbd "C-c C-d") 'xmp)
```

  この設定で C-c C-d を入力すると，編集中のファイルに xmp が実行されます．「# =>」を書くのが面倒だと思うかもしれませんが，コードが記述されている行で M-; を 2 回入力すれば挿入されるので大丈夫です．

  たいていのコードの試行錯誤はこれで事足ります．ただ，唯一コマンドライン引数が入力できないのが弱点．適宜 Smart Compile と使い分けましょう．

  余談ですが，Emacs Lisp で同じことを行える [Lisp Xmp](http://www.emacswiki.org/LispXmp) というのもあります．Emacs Lisp を書く人は是非．

# what_methods
  「このオブジェクトを○○にするメソッドって何だっけ？」ってときありますよね．そういうときに [what_methods](https://github.com/BMorearty/what_methods) の what? メソッドで簡単に調べられます．

  例えば，「(1..3)」を「[1,2,3]」にするメソッドが思いだせないときは，irb で以下のように実行します．

```ruby
    irb> require 'what_methods'
    => true
    irb> (1..3).what? [1,2,3]
    1..3.to_a == [1, 2, 3]
    1..3.entries == [1, 2, 3]
    1..3.sort == [1, 2, 3]
    => [:to_a, :entries, :sort]
```

## Emacs で what_methods を使う
   この what_methods を Emacs で使うとき，eshell を開いたりしてもいいのですが，anything のインターフェイスを利用して簡単に挿入できるような Elisp ([anything-ruby-methods](https://github.com/akisute3/anything-ruby-methods)) を書きました．オブジェクトの後ろで実行するとミニバッファが出力され，そこに出力結果を入力して RET を押すと，anything バッファにメソッド一覧が表示されるというものです．

   ![(1..3)がメソッドによって返してほしいオブジェクトをミニバッファに入力](http://www.fastpic.jp/images.php?file=2560853622.png)

   ![するとメソッドがanythingバッファに表示される．選択して挿入可能](http://www.fastpic.jp/images.php?file=2389010507.png)

   インストール方法は以下のとおりです．

   1. anything をインストール (auto-install が入っているなら M-x auto-install-batch anything でインストールできます)．
   2. gem install what_methods で what_methods をインストール．
   3. [anything-ruby-methods.el](https://raw.github.com/akisute3/anything-ruby-methods/master/anything-ruby-methods.el) をダウンロードして，ロードパスの通ったところに置く．
   4. 以下を .emacs に記述する．
      
```emacs-lisp
     (require 'anything-ruby-methods)
     (define-key ruby-mode-map (kbd "C-c d") 'anything-ruby-methods)
```

   C-c d を入力すると，行頭からカーソルまでを self として what? を実行します．transient-mark-mode がオン (リージョンが色つき) のときは，リージョンが self となります．

   ちなみにこれは what_methods にも言えることなのですが，お察しのとおり全メソッドを全て実行して出力が一致するか確認しています．そのため，what? に渡すオブジェクトにファイルを削除するなどの危険なコードが含まれているとそれを実行してしまうので，使用には十分注意しましょう．

# まとめ
  Emacs で Ruby の編集に便利なツールをいくつか紹介しました．その中でも断トツで xmpfilter が便利なのですが，まあ Emacs で Ruby 開発してる人ならほとんどの人が知ってますよね．「Emacs ではそんなことができるのか!?」と思った人がいれば，Emacs を使ってみるのもいいと思います．たぶん Vim でもできますが．

  anything-ruby-methods は作ったばかりなので全く洗練されていません．Elisp のコードも非常に残念な感じです．とりあえず私自身が使っていて今のところ問題が起こったことはありません．

  今後の機能拡張として，オブジェクトに使用可能な全てのメソッドを並べる情報源の追加はやりたいですね．これがあると，とりあえず実行してメソッドを眺めて (文字入力でメソッドを絞り込んで) 選択ってのが可能になります．ただ，メソッド補完は rcodetools とか RSense 使った方がいいような……．あとは，候補にカーソルをあわせて C-z で，そのメソッドのリファレンスを別のバッファに表示するとか．できるのかな？ そもそも本当にやるのかな？