Skip to content

Commit

Permalink
Support incremental search again by C-r in incremental search
Browse files Browse the repository at this point in the history
  • Loading branch information
aycabta committed Dec 1, 2019
1 parent b3ea098 commit 103b041
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
11 changes: 9 additions & 2 deletions lib/reline/line_editor.rb
Expand Up @@ -1158,13 +1158,16 @@ def finish
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
if grapheme_clusters.size > 0
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?
Expand All @@ -1177,7 +1180,11 @@ def finish
@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
Expand Down Expand Up @@ -1237,7 +1244,7 @@ def finish
@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
Expand Down
22 changes: 22 additions & 0 deletions test/reline/test_key_actor_emacs.rb
Expand Up @@ -1452,6 +1452,28 @@ def test_search_history_to_back_in_the_middle_of_histories
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')
Expand Down

0 comments on commit 103b041

Please sign in to comment.