[前][次][番号順一覧][スレッド一覧]

ruby-changes:59033

From: aycabta <ko1@a...>
Date: Mon, 2 Dec 2019 04:19:43 +0900 (JST)
Subject: [ruby-changes:59033] 103b04128f (master): Support incremental search again by C-r in incremental search

https://git.ruby-lang.org/ruby.git/commit/?id=103b04128f

From 103b04128f4e40b87bb9c7fb2916d2a800bfd94f Mon Sep 17 00:00:00 2001
From: aycabta <aycabta@g...>
Date: Mon, 2 Dec 2019 04:17:47 +0900
Subject: Support incremental search again by C-r in incremental search


diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 950bc3a..fb0b47d 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -1158,6 +1158,7 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1158
       last_hit = nil
       loop do
         key = Fiber.yield(search_word)
+        search_again = false
         case key
         when "\C-h".ord, "\C-?".ord
           grapheme_clusters = search_word.grapheme_clusters
@@ -1165,6 +1166,8 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1166
             grapheme_clusters.pop
             search_word = grapheme_clusters.join
           end
+        when "\C-r".ord
+          search_again = true
         else
           multibyte_buf << key
           if multibyte_buf.dup.force_encoding(@encoding).valid_encoding?
@@ -1177,7 +1180,11 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1180
           @history_pointer = nil
           hit = @line_backup_in_history
         else
-          if @history_pointer
+          if search_again
+            if @history_pointer
+              history = Reline::HISTORY[0..(@history_pointer - 1)]
+            end
+          elsif @history_pointer
             history = Reline::HISTORY[0..@history_pointer]
           else
             history = Reline::HISTORY
@@ -1237,7 +1244,7 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1244
         @cursor = @byte_pointer = 0
       else
         chr = k.is_a?(String) ? k : k.chr(Encoding::ASCII_8BIT)
-        if chr.match?(/[[:print:]]/) or k == "\C-h".ord or k == "\C-?".ord
+        if chr.match?(/[[:print:]]/) or k == "\C-h".ord or k == "\C-?".ord or k == "\C-r".ord
           searcher.resume(k)
         else
           if @history_pointer
diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb
index da2d41a..6ec583b 100644
--- a/test/reline/test_key_actor_emacs.rb
+++ b/test/reline/test_key_actor_emacs.rb
@@ -1452,6 +1452,28 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase https://github.com/ruby/ruby/blob/trunk/test/reline/test_key_actor_emacs.rb#L1452
     assert_cursor_max(4)
   end
 
+  def test_search_history_twice
+    Reline::HISTORY.concat([
+      '1235', # old
+      '12aa',
+      '1234' # new
+    ])
+    assert_line('')
+    assert_byte_pointer_size('')
+    assert_cursor(0)
+    assert_cursor_max(0)
+    input_keys("\C-r123")
+    assert_line('1234')
+    assert_byte_pointer_size('')
+    assert_cursor(0)
+    assert_cursor_max(0) # doesn't determine yet
+    input_keys("\C-r")
+    assert_line('1235')
+    assert_byte_pointer_size('')
+    assert_cursor(0)
+    assert_cursor_max(0)
+  end
+
   def test_em_set_mark_and_em_exchange_mark
     input_keys('aaa bbb ccc ddd')
     assert_byte_pointer_size('aaa bbb ccc ddd')
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]