summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/reline/line_editor.rb11
-rw-r--r--test/reline/test_key_actor_emacs.rb22
2 files changed, 31 insertions, 2 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 950bc3a955..fb0b47d7ee 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -1158,6 +1158,7 @@ class Reline::LineEditor
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
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
@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
@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 da2d41aa15..6ec583b3ef 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
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')