[ruby/reline] Enter newline if cursor position is middle of input

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

* Enter newline if cursor position is middle of input

* Add ed_force_submit to allow input confirmation on non-final lines

https://github.com/ruby/reline/commit/8ef534e904
This commit is contained in:
Mari Imaizumi 2025-01-07 04:21:05 +09:00 committed by git
parent 31905d9e23
commit 5698f4f2e1
2 changed files with 27 additions and 12 deletions

View File

@ -1673,17 +1673,10 @@ class Reline::LineEditor
finish finish
end end
else else
if @line_index == (@buffer_of_lines.size - 1) if @line_index == @buffer_of_lines.size - 1 && confirm_multiline_termination
if confirm_multiline_termination
finish
else
key_newline(key)
end
else
# should check confirm_multiline_termination to finish?
@line_index = @buffer_of_lines.size - 1
@byte_pointer = current_line.bytesize
finish finish
else
key_newline(key)
end end
end end
else else
@ -1691,6 +1684,11 @@ class Reline::LineEditor
end end
end end
private def ed_force_submit(_key)
process_insert(force: true)
finish
end
private def em_delete_prev_char(key, arg: 1) private def em_delete_prev_char(key, arg: 1)
arg.times do arg.times do
if @byte_pointer == 0 and @line_index > 0 if @byte_pointer == 0 and @line_index > 0

View File

@ -813,13 +813,30 @@ begin
close close
end end
def test_terminate_in_the_middle_of_lines def test_newline_in_the_middle_of_lines
start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.') start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def hoge\n 1\n 2\n 3\n 4\nend\n") write("def hoge\n 1\n 2\n 3\n 4\nend\n")
write("\C-p\C-p\C-p\C-e\n") write("\C-p\C-p\C-p\C-e\n")
assert_screen(<<~EOC) assert_screen(<<~EOC)
prompt> def hoge
prompt> 1
prompt> 2
prompt> 3 prompt> 3
prompt> 4 prompt>
EOC
close
end
def test_ed_force_submit_in_the_middle_of_lines
write_inputrc <<~LINES
"\\C-a": ed_force_submit
LINES
start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def hoge\nend")
write("\C-p\C-a")
assert_screen(<<~EOC)
Multiline REPL.
prompt> def hoge
prompt> end prompt> end
=> :hoge => :hoge
prompt> prompt>