ruby-changes:59287
From: aycabta <ko1@a...>
Date: Tue, 17 Dec 2019 13:11:14 +0900 (JST)
Subject: [ruby-changes:59287] 618d091151 (master): Support change search direction
https://git.ruby-lang.org/ruby.git/commit/?id=618d091151 From 618d09115185efa05f6948247d86087f4aa96118 Mon Sep 17 00:00:00 2001 From: aycabta <aycabta@g...> Date: Tue, 17 Dec 2019 13:10:39 +0900 Subject: Support change search direction diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index c74db52..9d8185f 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -1196,6 +1196,7 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1196 loop do key = Fiber.yield(search_word) search_again = false + change_direction = false case key when -1 # determined Reline.last_incremental_search = search_word @@ -1207,7 +1208,11 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1208 search_word = grapheme_clusters.join end when "\C-r".ord, "\C-s".ord - search_again = true if prev_search_key == key + if prev_search_key == key + search_again = true + else + change_direction = true + end prev_search_key = key else multibyte_buf << key @@ -1229,10 +1234,19 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1234 case prev_search_key when "\C-r".ord history_pointer_base = 0 - history = Reline::HISTORY[0..(@history_pointer - 1)] + if change_direction + history = Reline::HISTORY[0..@history_pointer] + else + history = Reline::HISTORY[0..(@history_pointer - 1)] + end when "\C-s".ord - history_pointer_base = @history_pointer + 1 - history = Reline::HISTORY[(@history_pointer + 1)..-1] + if change_direction + history_pointer_base = @history_pointer + history = Reline::HISTORY[(@history_pointer)..-1] + else + history_pointer_base = @history_pointer + 1 + history = Reline::HISTORY[(@history_pointer + 1)..-1] + end end else history_pointer_base = 0 @@ -1242,10 +1256,19 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L1256 case prev_search_key when "\C-r".ord history_pointer_base = 0 - history = Reline::HISTORY[0..@history_pointer] + if change_direction + history = Reline::HISTORY[0..@history_pointer] + else + history = Reline::HISTORY[0..@history_pointer] + end when "\C-s".ord - history_pointer_base = @history_pointer - history = Reline::HISTORY[@history_pointer..-1] + if change_direction + history_pointer_base = @history_pointer + history = Reline::HISTORY[(@history_pointer - 1)..-1] + else + history_pointer_base = @history_pointer + history = Reline::HISTORY[@history_pointer..-1] + end end else history_pointer_base = 0 diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb index 5e5be0c..8854df5 100644 --- a/test/reline/test_key_actor_emacs.rb +++ b/test/reline/test_key_actor_emacs.rb @@ -1620,6 +1620,70 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase https://github.com/ruby/ruby/blob/trunk/test/reline/test_key_actor_emacs.rb#L1620 assert_cursor_max(0) end + def test_search_history_front_and_back + Reline::HISTORY.concat([ + '1235', # old + '12aa', + '1234' # new + ]) + assert_line('') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + input_keys("\C-s12") + assert_line('1235') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) # doesn't determine yet + input_keys("\C-s") + assert_line('12aa') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + input_keys("\C-r") + assert_line('12aa') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + input_keys("\C-r") + assert_line('1235') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + end + + def test_search_history_back_and_front + Reline::HISTORY.concat([ + '1235', # old + '12aa', + '1234' # new + ]) + assert_line('') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + input_keys("\C-r12") + assert_line('1234') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) # doesn't determine yet + input_keys("\C-r") + assert_line('12aa') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + input_keys("\C-s") + assert_line('12aa') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + input_keys("\C-s") + assert_line('1234') + assert_byte_pointer_size('') + assert_cursor(0) + assert_cursor_max(0) + end + def test_search_history_to_back_in_the_middle_of_histories Reline::HISTORY.concat([ '1235', # old -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/