[ruby/reline] Remove instance variable @first_char

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

When Reline reads EOF, Reline.readline should return nil if and only if input is empty

https://github.com/ruby/reline/commit/cc74b3686a
This commit is contained in:
tomoya ishida 2024-06-06 20:20:23 +09:00 committed by git
parent fbb61a26e7
commit f465045dd6
2 changed files with 31 additions and 8 deletions

View File

@ -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

View File

@ -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__)