Skip to content

Ruby gem 名称を指定して Emacs の Dired でそのライブラリのディレクトリを即座に開く

Posted on:2009年10月28日 at 06:50

やりたいことはタイトルの通りなのだが、Emacs を使用中に Ruby の gem 名称でそのライブラリのディレクトリを Dired で開くこと。

Ruby には素敵な gem が多くあるが、 付属の Readme、RDoc だけでは使い方がよくわからない、 どうやったらこのような素敵なことができるのかソースを見てみたい、 などの理由でソースを読んでみたくなる。

@bguthrie さんが Textmate でやっているのを見て、Emacs にも流用できるなと。

上記のソースで gem which <gem name> なんて便利なコマンドが使えるのを初めて知った。。

Emacs のディレクトリ操作には標準で Dired が利用できる。 C-x C-f(find-file) で該当する gem のディレクトリを開けばよいのだが、 ちょっとしたことではあるが、タブ補完が効くとは言え、そのパスを入力するのは少々面倒臭い。

また、仕事の関係上、Mac、Win と併用して使っているので、異なる環境でパスを思い出すのもメンドイ。。
gem の名称だけでわかれば直接そして即座に開けるようだと、メモリ容量が減ってしまっている自分の頭にもやさしい。

elisp は全くの初心者なので、かなり無理やり感も漂い、もっといい方法もありそうなのだが、とりあえず以下のような感じでいけそう。

(defun search-gem-path (name)
  (shell-command-to-string
    (format "gem which %s | ruby -n -e 'if /lib/; print $_[0, $_.rindex(%%[lib])]; end'" name)))
(defun find-ruby-gem (name)
  (interactive "sRuby gem libraray name: ")
  (find-file (search-gem-path name)))

上記スクリプトを .emacs.el なりに書いて M-x find-ruby-gem <gem 名称> とやることで、gem 名称に指定した gem のルートディレクトリが Dired で開かれる。

例えば、twitter gem を開く場合、M-x find-ruby-gem twitter として、

find-ruby-gem1

Enter!

find-ruby-gem2

ホントちょっとしたことではあるが、うれしい。。

ちなみに、標準ライブラリのソースを開く場合には、 devel-which ライブラリ(http://raa.ruby-lang.org/list.rhtml?name=devel-which)を使うとよい。

$ irb --prompt simple
>> require 'devel/which'
=> true
>> which_library 'net/http'
=> "/opt/local/lib/ruby/1.8/net/http.rb"