diff --git a/lib/reline.rb b/lib/reline.rb index 796e637e85..654e27875a 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -264,7 +264,6 @@ def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination) raise ArgumentError.new('#readmultiline needs block to confirm multiline termination') end - Reline.update_iogate io_gate.with_raw_input do inner_readline(prompt, add_hist, true, &confirm_multiline_termination) end @@ -287,7 +286,6 @@ def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination) def readline(prompt = '', add_hist = false) @mutex.synchronize do - Reline.update_iogate io_gate.with_raw_input do inner_readline(prompt, add_hist, false) end @@ -474,7 +472,7 @@ def ambiguous_width end private def may_req_ambiguous_char_width - @ambiguous_width = 2 if io_gate.dumb? or !STDOUT.tty? + @ambiguous_width = 2 if io_gate.dumb? || !STDIN.tty? || !STDOUT.tty? return if defined? @ambiguous_width io_gate.move_cursor_column(0) begin @@ -568,18 +566,6 @@ def self.ungetc(c) def self.line_editor core.line_editor end - - def self.update_iogate - return if core.config.test_mode - - # Need to change IOGate when `$stdout.tty?` change from false to true by `$stdout.reopen` - # Example: rails/spring boot the application in non-tty, then run console in tty. - if ENV['TERM'] != 'dumb' && core.io_gate.dumb? && $stdout.tty? - require 'reline/io/ansi' - remove_const(:IOGate) - const_set(:IOGate, Reline::ANSI.new) - end - end end diff --git a/lib/reline/io.rb b/lib/reline/io.rb index 7fca0c338a..c1dd1a56c8 100644 --- a/lib/reline/io.rb +++ b/lib/reline/io.rb @@ -19,11 +19,7 @@ def self.decide_io_gate io end else - if $stdout.tty? - Reline::ANSI.new - else - Reline::Dumb.new - end + Reline::ANSI.new end end end diff --git a/lib/reline/io/ansi.rb b/lib/reline/io/ansi.rb index cf3c9965dd..aa8ff256e2 100644 --- a/lib/reline/io/ansi.rb +++ b/lib/reline/io/ansi.rb @@ -174,12 +174,10 @@ def inner_getc(timeout_second) Reline.core.line_editor.handle_signal end c = @input.getbyte - (c == 0x16 && @input.raw(min: 0, time: 0, &:getbyte)) || c + (c == 0x16 && @input.tty? && @input.raw(min: 0, time: 0, &:getbyte)) || c rescue Errno::EIO # Maybe the I/O has been closed. nil - rescue Errno::ENOTTY - nil end START_BRACKETED_PASTE = String.new("\e[200~", encoding: Encoding::ASCII_8BIT) @@ -239,12 +237,12 @@ def get_screen_size def set_screen_size(rows, columns) @input.winsize = [rows, columns] self - rescue Errno::ENOTTY + rescue Errno::ENOTTY, Errno::ENODEV self end def cursor_pos - begin + if @input.tty? && @output.tty? res = +'' m = nil @input.raw do |stdin| @@ -263,7 +261,7 @@ def cursor_pos end column = m[:column].to_i - 1 row = m[:row].to_i - 1 - rescue Errno::ENOTTY + else begin buf = @output.pread(@output.pos, 0) row = buf.count("\n") diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index 1cf46b4cd1..f119d686cd 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -969,6 +969,18 @@ def test_force_enter EOC end + def test_nontty + omit if Reline.core.io_gate.win? + cmd = %Q{ruby -e 'puts(%Q{ello\C-ah\C-e})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })' | ruby -e 'print STDIN.read'} + start_terminal(40, 50, ['bash', '-c', cmd]) + sleep 1 + close rescue nil + assert_screen(<<~'EOC') + > hello + "hello" + EOC + end + def test_eof_with_newline omit if Reline.core.io_gate.win? cmd = %Q{ruby -e 'print(%Q{abc def \\e\\r})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })'}