From 5698f4f2e1b8221a68989f881c03a41175736a8a Mon Sep 17 00:00:00 2001 From: Mari Imaizumi Date: Tue, 7 Jan 2025 04:21:05 +0900 Subject: [PATCH] [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 --- lib/reline/line_editor.rb | 18 ++++++++---------- test/reline/yamatanooroti/test_rendering.rb | 21 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index aa4c7facdc..20f10b4897 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -1673,17 +1673,10 @@ class Reline::LineEditor finish end else - if @line_index == (@buffer_of_lines.size - 1) - 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 + if @line_index == @buffer_of_lines.size - 1 && confirm_multiline_termination finish + else + key_newline(key) end end else @@ -1691,6 +1684,11 @@ class Reline::LineEditor end end + private def ed_force_submit(_key) + process_insert(force: true) + finish + end + private def em_delete_prev_char(key, arg: 1) arg.times do if @byte_pointer == 0 and @line_index > 0 diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index d946216001..aff5c0462b 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -813,13 +813,30 @@ begin close 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.') write("def hoge\n 1\n 2\n 3\n 4\nend\n") write("\C-p\C-p\C-p\C-e\n") assert_screen(<<~EOC) + prompt> def hoge + prompt> 1 + prompt> 2 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 => :hoge prompt>