ruby-changes:67311
From: aycabta <ko1@a...>
Date: Sun, 29 Aug 2021 20:30:46 +0900 (JST)
Subject: [ruby-changes:67311] ca1a2d1f68 (master): [ruby/reline] Show autocomplete correctly when starts from prev line
https://git.ruby-lang.org/ruby.git/commit/?id=ca1a2d1f68 From ca1a2d1f68b299f07e9953f8d739a4b7c12bc7a0 Mon Sep 17 00:00:00 2001 From: aycabta <aycabta@g...> Date: Wed, 25 Aug 2021 17:21:05 +0900 Subject: [ruby/reline] Show autocomplete correctly when starts from prev line https://github.com/ruby/reline/commit/f31a76ff31 --- lib/reline.rb | 8 ++++++-- lib/reline/line_editor.rb | 30 +++++++++++++++++------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/lib/reline.rb b/lib/reline.rb index 72621fe..eafed48 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -196,11 +196,15 @@ module Reline https://github.com/ruby/ruby/blob/trunk/lib/reline.rb#L196 result = nil 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 x = screen_width + x + y = -1 + else + y = 0 end - [Reline::CursorPos.new(x, nil), result] + [Reline::CursorPos.new(x, y), result] } inner_readline(prompt, add_hist, true, &confirm_multiline_termination) diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index a935fa9..0966c19 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -558,17 +558,17 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L558 end if (lower_space + @rest_height) >= DIALOG_HEIGHT @dialog_updown = :down - @dialog_vertical_offset = 1 + @dialog_vertical_offset = pos.y + 1 elsif upper_space >= DIALOG_HEIGHT @dialog_updown = :up - @dialog_vertical_offset = -(DIALOG_HEIGHT + 1) + @dialog_vertical_offset = pos.y + -(DIALOG_HEIGHT + 1) else if (lower_space + @rest_height) < DIALOG_HEIGHT scroll_down(DIALOG_HEIGHT) move_cursor_up(DIALOG_HEIGHT) end @dialog_updown = :down - @dialog_vertical_offset = 1 + @dialog_vertical_offset = pos.y + 1 end Reline::IOGate.hide_cursor 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 https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L585 @dialog_lines_backup = { lines: modify_lines(whole_lines), line_index: @line_index, + first_line_started_from: @first_line_started_from, started_from: @started_from, byte_pointer: @byte_pointer } @@ -604,9 +605,12 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L605 end 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 - move_cursor_down(old_dialog_vertical_offset) + move_cursor_down(old_dialog_vertical_offset - y_diff) start = visual_start + old_dialog_vertical_offset line_num = @dialog_vertical_offset - old_dialog_vertical_offset line_num.times do |i| @@ -615,11 +619,11 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L619 Reline::IOGate.erase_after_cursor move_cursor_down(1) if i < (line_num - 1) end - move_cursor_up(old_dialog_vertical_offset + line_num - 1) + move_cursor_up(old_dialog_vertical_offset + line_num - 1 - y_diff) 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 - 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 line_num = (old_dialog_vertical_offset + old_dialog_contents.size) - (@dialog_vertical_offset + @dialog_contents.size) line_num.times do |i| @@ -628,11 +632,11 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L632 Reline::IOGate.erase_after_cursor move_cursor_down(1) if i < (line_num - 1) 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 if old_dialog_column < @dialog_column # rerender left - move_cursor_down(old_dialog_vertical_offset) + move_cursor_down(old_dialog_vertical_offset - y_diff) width = @dialog_column - old_dialog_column start = visual_start + old_dialog_vertical_offset line_num = old_dialog_contents.size @@ -646,11 +650,11 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L650 @output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s move_cursor_down(1) if i < (line_num - 1) end - move_cursor_up(old_dialog_vertical_offset + line_num - 1) + move_cursor_up(old_dialog_vertical_offset + line_num - 1 - y_diff) end if (old_dialog_column + DIALOG_WIDTH) > (@dialog_column + DIALOG_WIDTH) # 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) start = visual_start + old_dialog_vertical_offset line_num = old_dialog_contents.size @@ -665,7 +669,7 @@ class Reline::LineEditor https://github.com/ruby/ruby/blob/trunk/lib/reline/line_editor.rb#L669 @output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s move_cursor_down(1) if i < (line_num - 1) end - move_cursor_up(old_dialog_vertical_offset + line_num - 1) + move_cursor_up(old_dialog_vertical_offset + line_num - 1 + y_diff) end Reline::IOGate.move_cursor_column(prompt_width + @cursor) end -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/