脳ざらし紀行


2005-02-19

_ [Ruby] irb で複数行の履歴を一度に表示

zsh だと複数行の履歴を一度に表示する機能があります。例えば、いま手元でCtrl-r で履歴 ./ruby を検索すると以下のように履歴に表示されました。

$ ./ruby -ve '   
[1, 2].each{|v|  
  Thread.start{
    p v
  }
}
'

irb でも

irb(main):001:0> class Foo
irb(main):002:1>   def foo
irb(main):003:2>     "foo"
irb(main):004:2>   end
irb(main):005:1> end

なんて入力した時は、履歴を検索した時に

irb(main):006:0> class Foo
                   def foo
                     "foo"
                   end
                 end

と表示してほしいですよね。以下のようなパッチで実現できます。

Index: irb.rb
===================================================================
RCS file: /src/ruby/lib/irb.rb,v
retrieving revision 1.7
diff -u -1 -r1.7 irb.rb
--- irb.rb      10 Jun 2003 05:22:16 -0000      1.7
+++ irb.rb      19 Feb 2005 03:25:57 -0000
@@ -97,2 +97,3 @@
       @scanner.exception_on_syntax_error = false
+      @hist_buf = nil
     end
@@ -125,2 +126,8 @@
        end
+        if indent == 0
+          if @hist_buf and @hist_buf != Readline::HISTORY[-1]
+            Readline::HISTORY.push(@hist_buf)
+          end
+          @hist_buf = nil
+        end
       end
@@ -131,2 +138,8 @@
            print l if @context.verbose?
+            if @hist_buf
+              @hist_buf = @hist_buf + "\n" +
+                ' ' * @context.io.prompt.size + Readline::HISTORY.pop
+            else
+              @hist_buf = Readline::HISTORY.pop
+            end
          else

IRB.conf[:SAVE_HISTORY] を true に設定してファイルに履歴を保存するようにしている場合は、以下のようなパッチも必要。

Index: input-method.rb
===================================================================
RCS file: /src/ruby/lib/irb/input-method.rb,v
retrieving revision 1.5
diff -u -1 -r1.5 input-method.rb
--- input-method.rb     7 Feb 2004 10:56:16 -0000       1.5
+++ input-method.rb     19 Feb 2005 03:02:11 -0000
@@ -96,3 +96,3 @@
               open(file, 'w' ) do |f|
-                hist = hist.to_a
+                hist = hist.to_a.map{|s| s.gsub(/(?!\Z)$/, '\\')} 
                 f.puts(hist[-num..-1] || hist)
@@ -111,3 +111,14 @@
 
-       loader = proc {|f| f.each {|l| HISTORY << l.chomp}}
+       loader = proc {|f|
+          buf = ''
+          f.each {|l|
+            if /\\\n/ =~ l
+              buf << l.sub(/\\\n/, "\n")
+            else
+              buf << l
+              HISTORY << buf.chomp
+              buf = ''
+            end
+          }
+        }
        if hist = IRB.conf[:HISTORY_FILE]
お名前:
E-mail:
コメント:
本日のリンク元

最近のコメント

2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|04|05|
2011|04|
2012|03|07|
2013|01|02|07|
トップ «前の日記(2005-02-18) 最新 次の日記(2005-02-20)» 編集