[ruby/reline] Fix dialog corrupts rendering by pushing up input line
too much (https://github.com/ruby/reline/pull/524) * Do not render dialog where it overflows screen * Dialog rendering should Scroll down only when needed * Refactor screen_y_range calculation Co-authored-by: Stan Lo <stan001212@gmail.com> --------- https://github.com/ruby/reline/commit/bc0e3d1310 Co-authored-by: Stan Lo <stan001212@gmail.com>
This commit is contained in:
parent
8b2884c0b5
commit
5eca327fc5
@ -708,10 +708,16 @@ class Reline::LineEditor
|
|||||||
# Clear and rerender all dialogs line by line
|
# Clear and rerender all dialogs line by line
|
||||||
Reline::IOGate.hide_cursor
|
Reline::IOGate.hide_cursor
|
||||||
ymin, ymax = (ranges_to_restore.keys + new_dialog_ranges.keys).minmax
|
ymin, ymax = (ranges_to_restore.keys + new_dialog_ranges.keys).minmax
|
||||||
|
scroll_partial_screen = @scroll_partial_screen || 0
|
||||||
|
screen_y_range = scroll_partial_screen..(scroll_partial_screen + @screen_height - 1)
|
||||||
|
ymin = ymin.clamp(screen_y_range.begin, screen_y_range.end)
|
||||||
|
ymax = ymax.clamp(screen_y_range.begin, screen_y_range.end)
|
||||||
dialog_y = @first_line_started_from + @started_from
|
dialog_y = @first_line_started_from + @started_from
|
||||||
cursor_y = dialog_y
|
cursor_y = dialog_y
|
||||||
|
if @highest_in_all < ymax
|
||||||
scroll_down(ymax - cursor_y)
|
scroll_down(ymax - cursor_y)
|
||||||
move_cursor_up(ymax - cursor_y)
|
move_cursor_up(ymax - cursor_y)
|
||||||
|
end
|
||||||
(ymin..ymax).each do |y|
|
(ymin..ymax).each do |y|
|
||||||
move_cursor_down(y - cursor_y)
|
move_cursor_down(y - cursor_y)
|
||||||
cursor_y = y
|
cursor_y = y
|
||||||
|
@ -957,6 +957,20 @@ begin
|
|||||||
EOC
|
EOC
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_simple_dialog_with_scroll_screen
|
||||||
|
start_terminal(5, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dialog simple}, startup_message: 'Multiline REPL.')
|
||||||
|
write("if 1\n 2\n 3\n 4\n 5\n 6")
|
||||||
|
write("\C-p\C-n\C-p\C-p\C-p#")
|
||||||
|
close
|
||||||
|
assert_screen(<<~'EOC')
|
||||||
|
prompt> 2
|
||||||
|
prompt> 3#
|
||||||
|
prompt> 4
|
||||||
|
prompt> 5
|
||||||
|
prompt> 6 Ruby is...
|
||||||
|
EOC
|
||||||
|
end
|
||||||
|
|
||||||
def test_autocomplete_at_bottom
|
def test_autocomplete_at_bottom
|
||||||
start_terminal(15, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.')
|
start_terminal(15, 50, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.')
|
||||||
write('def hoge' + "\C-m" * 10 + "end\C-p ")
|
write('def hoge' + "\C-m" * 10 + "end\C-p ")
|
||||||
@ -1360,12 +1374,12 @@ begin
|
|||||||
prompt>
|
prompt>
|
||||||
prompt>
|
prompt>
|
||||||
prompt>
|
prompt>
|
||||||
|
prompt> S
|
||||||
prompt> String
|
prompt> String
|
||||||
prompt> Struct
|
prompt> Struct
|
||||||
prompt> Symbol
|
prompt> enSymbol
|
||||||
prompt> enScriptError
|
ScriptError
|
||||||
SyntaxError
|
SyntaxError
|
||||||
Signal
|
|
||||||
EOC
|
EOC
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user