[ruby/reline] Ensure no escape sequence before printing prompt

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

https://github.com/ruby/reline/commit/f9227b5c89
This commit is contained in:
tomoya ishida 2024-06-05 03:34:57 +09:00 committed by git
parent 5ea843f9b2
commit 932ecd3a1c
2 changed files with 19 additions and 3 deletions

View File

@ -242,7 +242,7 @@ class Reline::ANSI < Reline::IO
end
def cursor_pos
if @input.tty? && @output.tty?
if both_tty?
res = +''
m = nil
@input.raw do |stdin|
@ -276,6 +276,10 @@ class Reline::ANSI < Reline::IO
Reline::CursorPos.new(column, row)
end
def both_tty?
@input.tty? && @output.tty?
end
def move_cursor_column(x)
@output.write "\e[#{x + 1}G"
end
@ -343,14 +347,14 @@ class Reline::ANSI < Reline::IO
def prep
# Enable bracketed paste
@output.write "\e[?2004h" if Reline.core.config.enable_bracketed_paste
@output.write "\e[?2004h" if Reline.core.config.enable_bracketed_paste && both_tty?
retrieve_keybuffer
nil
end
def deprep(otio)
# Disable bracketed paste
@output.write "\e[?2004l" if Reline.core.config.enable_bracketed_paste
@output.write "\e[?2004l" if Reline.core.config.enable_bracketed_paste && both_tty?
Signal.trap('WINCH', @old_winch_handler) if @old_winch_handler
end
end

View File

@ -378,6 +378,18 @@ class Reline::Test < Reline::TestCase
assert_match(/#<Reline::Dumb/, out.chomp)
end
def test_print_prompt_before_everything_else
pend if win?
lib = File.expand_path("../../lib", __dir__)
code = "p Reline::IOGate.class; p Reline.readline 'prompt> '"
out = IO.popen([Reline.test_rubybin, "-I#{lib}", "-rreline", "-e", code], "r+") do |io|
io.write "abc\n"
io.close_write
io.read
end
assert_match(/\AReline::ANSI\nprompt> /, out)
end
def test_require_reline_should_not_trigger_winsize
pend if win?
lib = File.expand_path("../../lib", __dir__)