[ruby/reline] Fix rendering bug of nomultiline prompt

(https://github.com/ruby/reline/pull/730)

Fix bug of `print('a'*10); Reline.readline('>')` wrong rendering

https://github.com/ruby/reline/commit/c0469a12b9
This commit is contained in:
tomoya ishida 2024-07-12 21:21:20 +09:00 committed by git
parent 94b87084a6
commit 17a4c7cfcf
3 changed files with 21 additions and 7 deletions

View File

@ -331,7 +331,7 @@ module Reline
end
end
line_editor.print_nomultiline_prompt(prompt)
line_editor.print_nomultiline_prompt
line_editor.update_dialogs
line_editor.rerender

View File

@ -490,13 +490,9 @@ class Reline::LineEditor
@output.puts lines.map { |l| "#{l}\r\n" }.join
end
def print_nomultiline_prompt(prompt)
return unless prompt && !@is_multiline
def print_nomultiline_prompt
# Readline's test `TestRelineAsReadline#test_readline` requires first output to be prompt, not cursor reset escape sequence.
@rendered_screen.lines = [[[0, Reline::Unicode.calculate_width(prompt, true), prompt]]]
@rendered_screen.cursor_y = 0
@output.write prompt
@output.write @prompt if @prompt && !@is_multiline
end
def render_differential

View File

@ -1823,6 +1823,24 @@ begin
EOC
end
def test_print_before_readline
code = <<~RUBY
puts 'Multiline REPL.'
2.times do
print 'a' * 10
Reline.readline '>'
end
RUBY
start_terminal(6, 30, ['ruby', "-I#{@pwd}/lib", '-rreline', '-e', code], startup_message: 'Multiline REPL.')
write "x\n"
close
assert_screen(<<~EOC)
Multiline REPL.
>x
>
EOC
end
def test_thread_safe
start_terminal(6, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
write("[Thread.new{Reline.readline'>'},Thread.new{Reline.readmultiline('>'){true}}].map(&:join).size\n")