Skip to content

Commit 694a540

Browse files
authored
Fix redisplay/insert_text called from pre_input_hook (#742)
* Fix redisplay/insert_text called from pre_input_hook * Rename insert_pasted_text to insert_multiline_text It is now used from Reline.insert_text which is not inserting pasted text
1 parent 66291b5 commit 694a540

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

lib/reline.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -324,14 +324,17 @@ def readline(prompt = '', add_hist = false)
324324
line_editor.prompt_proc = prompt_proc
325325
line_editor.auto_indent_proc = auto_indent_proc
326326
line_editor.dig_perfect_match_proc = dig_perfect_match_proc
327+
328+
# Readline calls pre_input_hook just after printing the first prompt.
329+
line_editor.print_nomultiline_prompt
327330
pre_input_hook&.call
331+
328332
unless Reline::IOGate.dumb?
329333
@dialog_proc_list.each_pair do |name_sym, d|
330334
line_editor.add_dialog_proc(name_sym, d.dialog_proc, d.context)
331335
end
332336
end
333337

334-
line_editor.print_nomultiline_prompt
335338
line_editor.update_dialogs
336339
line_editor.rerender
337340

@@ -343,7 +346,7 @@ def readline(prompt = '', add_hist = false)
343346
inputs.each do |key|
344347
if key.char == :bracketed_paste_start
345348
text = io_gate.read_bracketed_paste
346-
line_editor.insert_pasted_text(text)
349+
line_editor.insert_multiline_text(text)
347350
line_editor.scroll_into_view
348351
else
349352
line_editor.update(key)
@@ -457,8 +460,8 @@ def ambiguous_width
457460
def_single_delegator :line_editor, :byte_pointer, :point
458461
def_single_delegator :line_editor, :byte_pointer=, :point=
459462

460-
def self.insert_text(*args, &block)
461-
line_editor.insert_text(*args, &block)
463+
def self.insert_text(text)
464+
line_editor.insert_multiline_text(text)
462465
self
463466
end
464467

lib/reline/line_editor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1333,7 +1333,7 @@ def confirm_multiline_termination
13331333
@confirm_multiline_termination_proc.(temp_buffer.join("\n") + "\n")
13341334
end
13351335

1336-
def insert_pasted_text(text)
1336+
def insert_multiline_text(text)
13371337
save_old_buffer
13381338
pre = @buffer_of_lines[@line_index].byteslice(0, @byte_pointer)
13391339
post = @buffer_of_lines[@line_index].byteslice(@byte_pointer..)

test/reline/yamatanooroti/test_rendering.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,6 +1841,40 @@ def test_print_before_readline
18411841
EOC
18421842
end
18431843

1844+
def test_pre_input_hook_with_redisplay
1845+
code = <<~'RUBY'
1846+
puts 'Multiline REPL.'
1847+
Reline.pre_input_hook = -> do
1848+
Reline.insert_text 'abc'
1849+
Reline.redisplay # Reline doesn't need this but Readline requires calling redisplay
1850+
end
1851+
Reline.readline('prompt> ')
1852+
RUBY
1853+
start_terminal(6, 30, ['ruby', "-I#{@pwd}/lib", '-rreline', '-e', code], startup_message: 'Multiline REPL.')
1854+
assert_screen(<<~EOC)
1855+
Multiline REPL.
1856+
prompt> abc
1857+
EOC
1858+
end
1859+
1860+
def test_pre_input_hook_with_multiline_text_insert
1861+
# Frequently used pattern of pre_input_hook
1862+
code = <<~'RUBY'
1863+
puts 'Multiline REPL.'
1864+
Reline.pre_input_hook = -> do
1865+
Reline.insert_text "abc\nef"
1866+
end
1867+
Reline.readline('>')
1868+
RUBY
1869+
start_terminal(6, 30, ['ruby', "-I#{@pwd}/lib", '-rreline', '-e', code], startup_message: 'Multiline REPL.')
1870+
write("\C-ad")
1871+
assert_screen(<<~EOC)
1872+
Multiline REPL.
1873+
>abc
1874+
def
1875+
EOC
1876+
end
1877+
18441878
def test_thread_safe
18451879
start_terminal(6, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
18461880
write("[Thread.new{Reline.readline'>'},Thread.new{Reline.readmultiline('>'){true}}].map(&:join).size\n")

0 commit comments

Comments
 (0)