From ce389ade45f412351d7c91db60eaa5e19fcd8c5f Mon Sep 17 00:00:00 2001 From: aycabta Date: Fri, 11 Sep 2020 05:48:59 +0900 Subject: [ruby/reline] Move cursor to currect vertical pos after rendering a logical line https://github.com/ruby/reline/commit/9b932df544 --- lib/reline/line_editor.rb | 10 ++++---- test/reline/yamatanooroti/test_rendering.rb | 36 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index ede913292f..edea2fa3d7 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -524,12 +524,14 @@ class Reline::LineEditor end Reline::IOGate.erase_after_cursor if with_control - move_cursor_up(height - 1) + # Just after rendring, so the cursor is on the last line. if finished? - move_cursor_down(@started_from) + Reline::IOGate.move_cursor_column(0) + else + # Moves up from bottom of lines to the cursor position. + move_cursor_up(height - 1 - @started_from) + Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) end - move_cursor_down(@started_from) - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) end height end diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index d348b877d3..effeb7cff2 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -64,6 +64,42 @@ begin EOC end + def test_finish_autowrapped_line + start_terminal(10, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}) + sleep 0.5 + write("[{'user'=>{'email'=>'a@a', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]\n") + close + assert_screen(<<~EOC) + Multiline REPL. + prompt> [{'user'=>{'email'=>'a@a', 'id'= + >'ABC'}, 'version'=>4, 'status'=>'succee + ded'}] + => [{"user"=>{"email"=>"a@a", "id"=>"ABC + "}, "version"=>4, "status"=>"succeeded"} + ] + prompt> + EOC + end + + def test_finish_autowrapped_line_in_the_middle_of_lines + start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}) + sleep 0.5 + write("[{'user'=>{'email'=>'abcdef@abcdef', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]#{"\C-b"*7}\n") + close + assert_screen(<<~EOC) + Multiline REPL. + prompt> [{'user'=>{'email'=>'a + bcdef@abcdef', 'id'=>'ABC'}, ' + version'=>4, 'status'=>'succee + ded'}] + => [{"user"=>{"email"=>"abcdef + @abcdef", "id"=>"ABC"}, "versi + on"=>4, "status"=>"succeeded"} + ] + prompt> + EOC + end + def test_prompt File.open(@inputrc_file, 'w') do |f| f.write <<~'LINES' -- cgit v1.2.3