[ruby/reline] Fix completion dialog position when completed part is

wordwrapped
(https://github.com/ruby/reline/pull/692)

https://github.com/ruby/reline/commit/2d9acd16fe
This commit is contained in:
tomoya ishida 2024-05-01 01:51:21 +09:00 committed by git
parent d7ba0fec49
commit 614187f8c2
2 changed files with 38 additions and 6 deletions

View File

@ -225,17 +225,20 @@ module Reline
journey_data = completion_journey_data
return unless journey_data
target = journey_data.list[journey_data.pointer]
target = journey_data.list.first
completed = journey_data.list[journey_data.pointer]
result = journey_data.list.drop(1)
pointer = journey_data.pointer - 1
return if target.empty? || (result == [target] && pointer < 0)
return if completed.empty? || (result == [completed] && pointer < 0)
target_width = Reline::Unicode.calculate_width(target)
x = cursor_pos.x - target_width
if x < 0
x = screen_width + x
completed_width = Reline::Unicode.calculate_width(completed)
if cursor_pos.x <= completed_width - target_width
# When target is rendered on the line above cursor position
x = screen_width - completed_width
y = -1
else
x = [cursor_pos.x - completed_width, 0].max
y = 0
end
cursor_pos_to_render = Reline::CursorPos.new(x, y)

View File

@ -1185,7 +1185,36 @@ begin
assert_screen(<<~'EOC')
Multiline REPL.
prompt> St
r String
r
String
Struct
EOC
end
def test_autocomplete_target_at_end_of_line
start_terminal(20, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.')
write(' ')
write('Str')
write("\C-i")
close
assert_screen(<<~'EOC')
Multiline REPL.
prompt> Str
ing String
Struct
EOC
end
def test_autocomplete_completed_input_is_wrapped
start_terminal(20, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.')
write(' ')
write('Str')
write("\C-i")
close
assert_screen(<<~'EOC')
Multiline REPL.
prompt> Stri
ng String
Struct
EOC
end