Emacsの中からrdefsを呼ぶ

Rubyのコードを読んでるとき、全体の構造をぱっと把握したいことがある。RDocやSDoc、あるいはYARDといったドキュメント生成ツールもいいけど、こういうツールはソースコードを読むためのものというよりも、APIを調べるためのものなので、クラスやメソッドが記述順やファイル配置とは無関係に整理されてしまう。使うときにはいいけど、学習目的で読むというときには素に近いほうがいい。

コードの構成そのままに、単にクラスやモジュール、メソッドの定義を引っ張り出して眺めたいときには、青木峰郎氏が作ったrdefsが使える。これをEmacsで呼べるように以下のように書いた。

;;; extract-ruby-defs with rdefs
(defun ruby-defs ()
  (interactive)
  (let ((obuf (current-buffer)))
    (setq buf (get-buffer-create "*rdefs*"))
    (set-buffer buf)
    (erase-buffer)
    (set-buffer obuf)
    (call-process-region
     (point-min)
     (point-max) "/path/to/bin/rdefs" nil buf)
    (switch-to-buffer-other-window buf)
    (ruby-mode)))