Ruby リファレンスマニュアル(通称るりま)と ReFe2 をインストール・ Emacs で参照する・ anything.el との連携
[update] Ruby リファレンスマニュアルを Emacs で参照・ anything.el との連携(改訂版) - http://rubikitch.com/に移転しました
るりまがリリースされたのでインストールしてみる。かなりの充実ぶりに驚く。
次世代 ReFe は BitClust というツールがベースとなっている。 BitClust はリファレンスマニュアル用ツール群で専用 Web サーバーなどを提供しているみたい。
とりあえず展開して BitClust をインストール。
インストール
url=http://www.ruby-lang.org/ja/man/archive/ruby-refm-1.9.0-dynamic.tar.bz2 cd ~/compile; wget $url cd `basename $url .tar.bz2` cd bitclust; sudo ruby setup.rb
ReFe2 を使う
ReFe2 を使うには、データベースを指定しないといけない。いちいち指定するのがめんどいので、さくっとスクリプトを作成。 1.8.6 と 1.9.0 両対応なので、古い方との差分も出すようにしてみた。以下からもってけ!
http://www.rubyist.net/~rubikitch/archive/refe2
#!/bin/sh cd ~/compile/ruby-refm-1.9.0-dynamic/bitclust/ old=/tmp/refm.old new=/tmp/refm.new cat <<XXXX ################################################## # ruby 1.9.0 # ################################################## XXXX ruby -Ke -Ilib bin/refe.rb -d ../db-1_9_0 "$@" | tee $new cat <<XXXX ################################################## # changes from ruby 1.8.6 # ################################################## XXXX ruby -Ke -Ilib bin/refe.rb -d ../db-1_8_6 "$@" > $old diff -u $old $new rm -f $old $new
たとえば「 refe2 Array flatten 」とすると「 Array#flatten 」の説明がでてくる。
##################################################
# ruby 1.9.0 #
##################################################
Array#flatten
--- flatten(lv = nil) -> Array
--- flatten!(lv = nil) -> self | nil
flatten は自身を再帰的に平滑化した配列を生成して返します。 flatten! は
自身を再帰的かつ破壊的に平滑化し、平滑化が行われた場合は self をそうでない
場合は nil を返します。
lv が指定された場合、 lv の深さまで再帰的に平滑化します。
@param lv 平滑化の再帰の深さを整数で指定します。 nil を指定した場合、再帰の深さの制限無しに平滑化します。
@raise ArgumentError 配列要素が自身を含むような無限にネストした配列に対して flatten を呼んだ場合に発生します。
# 自身を再帰的に平滑化する例。
a = [1, [2, 3, [4], 5]]
p a.flatten #=> [1, 2, 3, 4, 5]
p a #=> [1, [2, 3, [4], 5]]
# 自身を破壊的に平滑化する例。
a = [[[1, [2, 3]]]]
p a.flatten! #=> [1, 2, 3]
p a #=> [1, 2, 3]
# 平滑化が行われない場合は nil を返す。
p [1, 2, 3].flatten! #=> nil
# 平滑化の再帰の深さを指定する例。
a = [ 1, 2, [3, [4, 5] ] ]
a.flatten(1) #=> [1, 2, 3, [4, 5]]
##################################################
# changes from ruby 1.8.6 #
##################################################
--- /tmp/refm.old 2007-12-28 04:07:12.735596235 +0900
+++ /tmp/refm.new 2007-12-28 04:07:12.235567620 +0900
@@ -1,11 +1,13 @@
Array#flatten
---- flatten -> Array
---- flatten! -> self | nil
+--- flatten(lv = nil) -> Array
+--- flatten!(lv = nil) -> self | nil
flatten は自身を再帰的に平滑化した配列を生成して返します。 flatten! は
自身を再帰的かつ破壊的に平滑化し、平滑化が行われた場合は self をそうでない
場合は nil を返します。
+lv が指定された場合、 lv の深さまで再帰的に平滑化します。
+@param lv 平滑化の再帰の深さを整数で指定します。 nil を指定した場合、再帰の深さの制限無しに平滑化します。
@raise ArgumentError 配列要素が自身を含むような無限にネストした配列に対して flatten を呼んだ場合に発生します。
@@ -21,4 +23,8 @@
# 平滑化が行われない場合は nil を返す。
p [1, 2, 3].flatten! #=> nil
+
+ # 平滑化の再帰の深さを指定する例。
+ a = [ 1, 2, [3, [4, 5] ] ]
+ a.flatten(1) #=> [1, 2, 3, [4, 5]]
クラス名・メソッド名の目次を作成する。
bitclust コマンドでクラス名やメソッド名をリストすることができる。全リストを保存しておく。
cd ~/compile/ruby-refm-1.9.0-dynamic/bitclust/ (ruby -Ke -Ilib bin/bitclust.rb --database ../db-1_9_0 list --class; ruby -Ke -Ilib bin/bitclust.rb --database ../db-1_9_0 list --method) > refe2.index
そして、 Emacs で使うために S 式にしておく。
ruby -ne 'print "# (refe2 \"",$_.chomp,"\")\n"' refe2.index > refe2.e
いちおう、作成したものを置いておくから作業が面倒な人はもってけ!
http://www.rubyist.net/~rubikitch/archive/refe2.e
Emacs で使う。
Emacs で使うために、さくっと refe2 関数を作成。
refe2.e を開いて、見たいドキュメントの S 式を指定して C-e C-x C-e すれば、ドキュメントがポップアップする。もちろん対話的にも使える。
(defun refe2 (kw)
(interactive "sReFe2: ")
(let ((coding-system-for-read 'euc-japan))
(with-current-buffer (get-buffer-create (concat "*refe2:" kw "*"))
(when (zerop (buffer-size))
(call-process "refe2" nil t t kw)
(diff-mode))
(setq minibuffer-scroll-window (get-buffer-window (current-buffer) t))
(goto-char (point-min))
(display-buffer (current-buffer)))))
anything.el との連携
俺は anything の熱狂的ユーザーなので anything で絞り込み検索できないと気がすまない。以下の設定で使えるようになる。 refe2.e はこのために作ったのだ。
(defun anything-c-source-static-escript (symbol desc filename &rest other-attrib)
`((name . ,desc)
(candidates . ,symbol)
,@other-attrib
(init
. (lambda ()
(unless (and (boundp ',symbol) ,symbol)
(with-current-buffer (find-file-noselect ,filename)
(setq ,symbol (split-string (buffer-string) "\n" t))))))
(action
("Eval it"
. (lambda (cand)
(with-temp-buffer
(insert cand)
(cd ,(file-name-directory filename))
(backward-sexp 1)
(eval (read (current-buffer)))))))))
(setq anything-c-source-refe2
(anything-c-source-static-escript
'anything-c-refe2-candidates "ReFe2"
"~/compile/ruby-refm-1.9.0-dynamic/bitclust/refe2.e"
'(requires-pattern . 3)))
(setq anything-sources (list anything-c-source-refe2))
--><
もちろん anything-sources は各自好きなように設定してくれ。
これだけたくさんの要素があるのに、動作はかなり速いね。 langhelp の Emacs インターフェース部分を anything で置き換えようかな…。そもそも anything のようなものが欲しくて langhelp を作ったんだから。
追記
refe2 コマンドは、古いバージョンとの diff を取るようにした。それに伴い refe2 バッファは diff-mode に。