summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2021-02-05 21:39:29 +0900
committeraycabta <aycabta@gmail.com>2021-02-07 05:12:19 +0900
commit300084a85475988ba7c22e335230f31ec415dfc5 (patch)
tree5d2cbaca03c94132a1482781b7c84943fec738c7
parentfee19da2305c2977985206b7db86917d0f7ac8db (diff)
[ruby/reline] Terminate correctly in the middle of lines higher than the screen
https://github.com/ruby/reline/commit/e1d9240ada
-rw-r--r--lib/reline/line_editor.rb22
-rw-r--r--test/reline/yamatanooroti/test_rendering.rb14
2 files changed, 32 insertions, 4 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 31640fd743..557b5aa737 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -394,7 +394,12 @@ class Reline::LineEditor
Reline::IOGate.move_cursor_column(0)
@scroll_partial_screen = nil
prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines, prompt)
- modify_lines(whole_lines).each_with_index do |line, index|
+ if @previous_line_index
+ new_lines = whole_lines(index: @previous_line_index, line: @line)
+ else
+ new_lines = whole_lines
+ end
+ modify_lines(new_lines).each_with_index do |line, index|
@output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\n"
Reline::IOGate.erase_after_cursor
end
@@ -426,8 +431,13 @@ class Reline::LineEditor
if @is_multiline
if finished?
# Always rerender on finish because output_modifier_proc may return a different output.
- line = modify_lines(whole_lines)[@line_index]
- prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines, prompt)
+ if @previous_line_index
+ new_lines = whole_lines(index: @previous_line_index, line: @line)
+ else
+ new_lines = whole_lines
+ end
+ line = modify_lines(new_lines)[@line_index]
+ prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines, prompt)
render_partial(prompt, prompt_width, line, @first_line_started_from)
move_cursor_down(@highest_in_all - (@first_line_started_from + @highest_in_this - 1) - 1)
scroll_down(1)
@@ -1324,7 +1334,11 @@ class Reline::LineEditor
if @buffer_of_lines.size == 1 and @line.nil?
nil
else
- whole_lines.join("\n")
+ if @previous_line_index
+ whole_lines(index: @previous_line_index, line: @line).join("\n")
+ else
+ whole_lines.join("\n")
+ end
end
end
diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb
index 22c9316429..0ccc331efd 100644
--- a/test/reline/yamatanooroti/test_rendering.rb
+++ b/test/reline/yamatanooroti/test_rendering.rb
@@ -692,6 +692,20 @@ begin
EOC
end
+ def test_terminate_in_the_middle_of_lines
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ write("def hoge\n 1\n 2\n 3\n 4\nend\n")
+ write("\C-p\C-p\C-p\C-e\n")
+ close
+ assert_screen(<<~EOC)
+ prompt> 3
+ prompt> 4
+ prompt> end
+ => :hoge
+ prompt>
+ EOC
+ end
+
private def write_inputrc(content)
File.open(@inputrc_file, 'w') do |f|
f.write content