diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 884b78ffdf..d659378acd 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -238,7 +238,6 @@ class Reline::LineEditor @perfect_matched = nil @menu_info = nil @searching_prompt = nil - @first_char = true @just_cursor_moving = false @eof = false @continuous_insertion_buffer = String.new(encoding: @encoding) @@ -1110,13 +1109,10 @@ class Reline::LineEditor end if key.char.nil? process_insert(force: true) - if @first_char - @eof = true - end + @eof = buffer_empty? finish return end - @first_char = false @completion_occurs = false if key.char.is_a?(Symbol) @@ -1409,6 +1405,10 @@ class Reline::LineEditor whole_lines.join("\n") end + private def buffer_empty? + current_line.empty? and @buffer_of_lines.size == 1 + end + def finished? @finished end @@ -1937,7 +1937,7 @@ class Reline::LineEditor alias_method :kill_whole_line, :em_kill_line private def em_delete(key) - if current_line.empty? and @buffer_of_lines.size == 1 and key == "\C-d".ord + if buffer_empty? and key == "\C-d".ord @eof = true finish elsif @byte_pointer < current_line.bytesize @@ -2285,8 +2285,7 @@ class Reline::LineEditor end private def vi_list_or_eof(key) - if current_line.empty? and @buffer_of_lines.size == 1 - set_current_line('', 0) + if buffer_empty? @eof = true finish else diff --git a/test/reline/test_reline.rb b/test/reline/test_reline.rb index 601e484048..f2feab684d 100644 --- a/test/reline/test_reline.rb +++ b/test/reline/test_reline.rb @@ -390,6 +390,30 @@ class Reline::Test < Reline::TestCase assert_match(/\AReline::ANSI\nprompt> /, out) end + def test_read_eof_returns_input + pend if win? + lib = File.expand_path("../../lib", __dir__) + code = "p result: Reline.readline" + out = IO.popen([Reline.test_rubybin, "-I#{lib}", "-rreline", "-e", code], "r+") do |io| + io.write "a\C-a" + io.close_write + io.read + end + assert_include(out, '{:result=>"a"}') + end + + def test_read_eof_returns_nil_if_empty + pend if win? + lib = File.expand_path("../../lib", __dir__) + code = "p result: Reline.readline" + out = IO.popen([Reline.test_rubybin, "-I#{lib}", "-rreline", "-e", code], "r+") do |io| + io.write "a\C-h" + io.close_write + io.read + end + assert_include(out, '{:result=>nil}') + end + def test_require_reline_should_not_trigger_winsize pend if win? lib = File.expand_path("../../lib", __dir__)