irb の中で refe を使う

~/.irbrc に以下を追加するだけ。

module Kernel
  def r(arg)
    puts `refe #{arg}`
  end
  private :r
end

class Module
  def r(meth = nil)
    if meth
      if instance_methods(false).include? meth.to_s
        puts `refe #{self}##{meth}`
      else
        super
      end
    else
      puts `refe #{self}`
    end
  end
end


こんな感じで使うらしい。

>> Array.r :inspect
Array < Object#inspect
 --- inspect

    オブジェクトを人間が読める形式に変換した文字列を返します。

    組み込み関数 p は、このメソッドの結果を使用して
    オブジェクトを表示します。

=> nil


また、ri も使いたいときは、ソースコード中のメソッド名 r を何か適当な名前に変えるだけでOK。一応、載せておく(コマンド名は、素直に ri にしておいた)。

module Kernel
  def ri(arg)
    puts `ri #{arg}`
  end
  private :ri
end

class Module
  def ri(meth = nil)
    if meth
      if instance_methods(false).include? meth.to_s
        puts `ri #{self}##{meth}`
      else
        super
      end
    else
      puts `ri #{self}`
    end
  end
end


使い方は、refe の時と同じ。

$ irb
>> Array.ri :inspect
---------------------------------------------------------- Array#inspect
     array.inspect  -> string
------------------------------------------------------------------------
     Create a printable version of _array_.

=> nil


メソッド名 r から ri の置換を手書きで行うのが面倒なら、rubyワンライナー書くのもよいかもしれない。(ピッケル本 p152 参照)

$ ruby -pi.bak -e "gsub(/r\(/, 'ri\(')" .irbrc


ちなみに、-i オプションに .bak のようなバックアップファイルの拡張子は必須みたいだ。.bak をつけないで実行すると、

$ ruby -pi -e "gsub(/r\(/, 'ri\(')" hoge.txt
-e:1: Can't do inplace edit without backup (fatal)


となって、置換できない。以下のメーリングリスト(ruby-list)によると、Windowsの場合はバックアップ無しで置換できないらしい。
[ruby-list:38066] Re: ファイル書換え?


余談だけど、ri のバージョンが古い気がする。どうやったら最新版にできるんだろう? refe だったら、

$ gem update refe


とすれば簡単に更新できて便利なんだけどな。まあ、今日は遅いからそろそろ寝て、後で考えよう。

参考

:情報源
Rubygarden.org:恐らく上記情報源のネタ元
:元々はメーリングリスト(ruby-talk)の発言らしい