mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/reline] Show autocomplete correctly when starts from prev line
f31a76ff31
This commit is contained in:
parent
06bd48aba8
commit
ca1a2d1f68
2 changed files with 23 additions and 15 deletions
|
@ -196,11 +196,15 @@ module Reline
|
||||||
result = nil
|
result = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
x = cursor_pos.x - Reline::Unicode.calculate_width(target)
|
target_width = Reline::Unicode.calculate_width(target)
|
||||||
|
x = cursor_pos.x - target_width
|
||||||
if x < 0
|
if x < 0
|
||||||
x = screen_width + x
|
x = screen_width + x
|
||||||
|
y = -1
|
||||||
|
else
|
||||||
|
y = 0
|
||||||
end
|
end
|
||||||
[Reline::CursorPos.new(x, nil), result]
|
[Reline::CursorPos.new(x, y), result]
|
||||||
}
|
}
|
||||||
inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
|
inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
|
||||||
|
|
||||||
|
|
|
@ -558,17 +558,17 @@ class Reline::LineEditor
|
||||||
end
|
end
|
||||||
if (lower_space + @rest_height) >= DIALOG_HEIGHT
|
if (lower_space + @rest_height) >= DIALOG_HEIGHT
|
||||||
@dialog_updown = :down
|
@dialog_updown = :down
|
||||||
@dialog_vertical_offset = 1
|
@dialog_vertical_offset = pos.y + 1
|
||||||
elsif upper_space >= DIALOG_HEIGHT
|
elsif upper_space >= DIALOG_HEIGHT
|
||||||
@dialog_updown = :up
|
@dialog_updown = :up
|
||||||
@dialog_vertical_offset = -(DIALOG_HEIGHT + 1)
|
@dialog_vertical_offset = pos.y + -(DIALOG_HEIGHT + 1)
|
||||||
else
|
else
|
||||||
if (lower_space + @rest_height) < DIALOG_HEIGHT
|
if (lower_space + @rest_height) < DIALOG_HEIGHT
|
||||||
scroll_down(DIALOG_HEIGHT)
|
scroll_down(DIALOG_HEIGHT)
|
||||||
move_cursor_up(DIALOG_HEIGHT)
|
move_cursor_up(DIALOG_HEIGHT)
|
||||||
end
|
end
|
||||||
@dialog_updown = :down
|
@dialog_updown = :down
|
||||||
@dialog_vertical_offset = 1
|
@dialog_vertical_offset = pos.y + 1
|
||||||
end
|
end
|
||||||
Reline::IOGate.hide_cursor
|
Reline::IOGate.hide_cursor
|
||||||
reset_dialog(old_dialog_contents, old_dialog_contents_width, old_dialog_column, old_dialog_vertical_offset, old_dialog_updown)
|
reset_dialog(old_dialog_contents, old_dialog_contents_width, old_dialog_column, old_dialog_vertical_offset, old_dialog_updown)
|
||||||
|
@ -585,6 +585,7 @@ class Reline::LineEditor
|
||||||
@dialog_lines_backup = {
|
@dialog_lines_backup = {
|
||||||
lines: modify_lines(whole_lines),
|
lines: modify_lines(whole_lines),
|
||||||
line_index: @line_index,
|
line_index: @line_index,
|
||||||
|
first_line_started_from: @first_line_started_from,
|
||||||
started_from: @started_from,
|
started_from: @started_from,
|
||||||
byte_pointer: @byte_pointer
|
byte_pointer: @byte_pointer
|
||||||
}
|
}
|
||||||
|
@ -604,9 +605,12 @@ class Reline::LineEditor
|
||||||
end
|
end
|
||||||
visual_lines.concat(vl)
|
visual_lines.concat(vl)
|
||||||
}
|
}
|
||||||
if old_dialog_vertical_offset < @dialog_vertical_offset
|
old_y = @dialog_lines_backup[:first_line_started_from] + @dialog_lines_backup[:started_from]
|
||||||
|
y = @first_line_started_from + @started_from
|
||||||
|
y_diff = y - old_y
|
||||||
|
if (old_y + old_dialog_vertical_offset) < (y + @dialog_vertical_offset)
|
||||||
# rerender top
|
# rerender top
|
||||||
move_cursor_down(old_dialog_vertical_offset)
|
move_cursor_down(old_dialog_vertical_offset - y_diff)
|
||||||
start = visual_start + old_dialog_vertical_offset
|
start = visual_start + old_dialog_vertical_offset
|
||||||
line_num = @dialog_vertical_offset - old_dialog_vertical_offset
|
line_num = @dialog_vertical_offset - old_dialog_vertical_offset
|
||||||
line_num.times do |i|
|
line_num.times do |i|
|
||||||
|
@ -615,11 +619,11 @@ class Reline::LineEditor
|
||||||
Reline::IOGate.erase_after_cursor
|
Reline::IOGate.erase_after_cursor
|
||||||
move_cursor_down(1) if i < (line_num - 1)
|
move_cursor_down(1) if i < (line_num - 1)
|
||||||
end
|
end
|
||||||
move_cursor_up(old_dialog_vertical_offset + line_num - 1)
|
move_cursor_up(old_dialog_vertical_offset + line_num - 1 - y_diff)
|
||||||
end
|
end
|
||||||
if (old_dialog_vertical_offset + old_dialog_contents.size) > (@dialog_vertical_offset + @dialog_contents.size)
|
if (old_y + old_dialog_vertical_offset + old_dialog_contents.size) > (y + @dialog_vertical_offset + @dialog_contents.size)
|
||||||
# rerender bottom
|
# rerender bottom
|
||||||
move_cursor_down(@dialog_vertical_offset + @dialog_contents.size)
|
move_cursor_down(@dialog_vertical_offset + @dialog_contents.size - y_diff)
|
||||||
start = visual_start + @dialog_vertical_offset + @dialog_contents.size
|
start = visual_start + @dialog_vertical_offset + @dialog_contents.size
|
||||||
line_num = (old_dialog_vertical_offset + old_dialog_contents.size) - (@dialog_vertical_offset + @dialog_contents.size)
|
line_num = (old_dialog_vertical_offset + old_dialog_contents.size) - (@dialog_vertical_offset + @dialog_contents.size)
|
||||||
line_num.times do |i|
|
line_num.times do |i|
|
||||||
|
@ -628,11 +632,11 @@ class Reline::LineEditor
|
||||||
Reline::IOGate.erase_after_cursor
|
Reline::IOGate.erase_after_cursor
|
||||||
move_cursor_down(1) if i < (line_num - 1)
|
move_cursor_down(1) if i < (line_num - 1)
|
||||||
end
|
end
|
||||||
move_cursor_up(@dialog_vertical_offset + @dialog_contents.size + line_num - 1)
|
move_cursor_up(@dialog_vertical_offset + @dialog_contents.size + line_num - 1 - y_diff)
|
||||||
end
|
end
|
||||||
if old_dialog_column < @dialog_column
|
if old_dialog_column < @dialog_column
|
||||||
# rerender left
|
# rerender left
|
||||||
move_cursor_down(old_dialog_vertical_offset)
|
move_cursor_down(old_dialog_vertical_offset - y_diff)
|
||||||
width = @dialog_column - old_dialog_column
|
width = @dialog_column - old_dialog_column
|
||||||
start = visual_start + old_dialog_vertical_offset
|
start = visual_start + old_dialog_vertical_offset
|
||||||
line_num = old_dialog_contents.size
|
line_num = old_dialog_contents.size
|
||||||
|
@ -646,11 +650,11 @@ class Reline::LineEditor
|
||||||
@output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s
|
@output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s
|
||||||
move_cursor_down(1) if i < (line_num - 1)
|
move_cursor_down(1) if i < (line_num - 1)
|
||||||
end
|
end
|
||||||
move_cursor_up(old_dialog_vertical_offset + line_num - 1)
|
move_cursor_up(old_dialog_vertical_offset + line_num - 1 - y_diff)
|
||||||
end
|
end
|
||||||
if (old_dialog_column + DIALOG_WIDTH) > (@dialog_column + DIALOG_WIDTH)
|
if (old_dialog_column + DIALOG_WIDTH) > (@dialog_column + DIALOG_WIDTH)
|
||||||
# rerender right
|
# rerender right
|
||||||
move_cursor_down(old_dialog_vertical_offset)
|
move_cursor_down(old_dialog_vertical_offset + y_diff)
|
||||||
width = (old_dialog_column + DIALOG_WIDTH) - (@dialog_column + DIALOG_WIDTH)
|
width = (old_dialog_column + DIALOG_WIDTH) - (@dialog_column + DIALOG_WIDTH)
|
||||||
start = visual_start + old_dialog_vertical_offset
|
start = visual_start + old_dialog_vertical_offset
|
||||||
line_num = old_dialog_contents.size
|
line_num = old_dialog_contents.size
|
||||||
|
@ -665,7 +669,7 @@ class Reline::LineEditor
|
||||||
@output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s
|
@output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s
|
||||||
move_cursor_down(1) if i < (line_num - 1)
|
move_cursor_down(1) if i < (line_num - 1)
|
||||||
end
|
end
|
||||||
move_cursor_up(old_dialog_vertical_offset + line_num - 1)
|
move_cursor_up(old_dialog_vertical_offset + line_num - 1 + y_diff)
|
||||||
end
|
end
|
||||||
Reline::IOGate.move_cursor_column(prompt_width + @cursor)
|
Reline::IOGate.move_cursor_column(prompt_width + @cursor)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue