diff options
| author | tomoya ishida <tomoyapenguin@gmail.com> | 2024-04-15 22:15:52 +0900 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2024-04-15 13:15:58 +0000 |
| commit | 43f4da3ebfe39995fa6476af4ba4514ece8e4b4a (patch) | |
| tree | da8b939ff3e21da933d739b0b94a7002339b211c | |
| parent | 07ff4aa19b4f7cda9948ef5104bd1623e0c3eafc (diff) | |
[ruby/reline] Fix vi_to_column which was broken
(https://github.com/ruby/reline/pull/679)
https://github.com/ruby/reline/commit/9e93ad52e7
| -rw-r--r-- | lib/reline/line_editor.rb | 19 | ||||
| -rw-r--r-- | test/reline/test_key_actor_vi.rb | 14 |
2 files changed, 18 insertions, 15 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 38df6bd211..45c6894ff8 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -540,10 +540,6 @@ class Reline::LineEditor new_lines.size - y end - def current_row - wrapped_lines.flatten[wrapped_cursor_y] - end - def upper_space_height(wrapped_cursor_y) wrapped_cursor_y - screen_scroll_top end @@ -2483,18 +2479,11 @@ class Reline::LineEditor end private def vi_to_column(key, arg: 0) - current_row_width = calculate_width(current_row) - @byte_pointer, = current_line.grapheme_clusters.inject([0, 0]) { |total, gc| - # total has [byte_size, cursor] + # Implementing behavior of vi, not Readline's vi-mode. + @byte_pointer, = current_line.grapheme_clusters.inject([0, 0]) { |(total_byte_size, total_width), gc| mbchar_width = Reline::Unicode.get_mbchar_width(gc) - if (total.last + mbchar_width) >= arg - break total - elsif (total.last + mbchar_width) >= current_row_width - break total - else - total = [total.first + gc.bytesize, total.last + mbchar_width] - total - end + break [total_byte_size, total_width] if (total_width + mbchar_width) >= arg + [total_byte_size + gc.bytesize, total_width + mbchar_width] } end diff --git a/test/reline/test_key_actor_vi.rb b/test/reline/test_key_actor_vi.rb index e72eedb904..cf3943ae37 100644 --- a/test/reline/test_key_actor_vi.rb +++ b/test/reline/test_key_actor_vi.rb @@ -711,6 +711,20 @@ class Reline::KeyActor::ViInsert::Test < Reline::TestCase assert_line_around_cursor('', ' abcde ABCDE ') end + def test_vi_to_column + input_keys("a一二三\C-[0") + input_keys('1|') + assert_line_around_cursor('', 'a一二三') + input_keys('2|') + assert_line_around_cursor('a', '一二三') + input_keys('3|') + assert_line_around_cursor('a', '一二三') + input_keys('4|') + assert_line_around_cursor('a一', '二三') + input_keys('9|') + assert_line_around_cursor('a一二', '三') + end + def test_vi_delete_meta input_keys("aaa bbb ccc ddd eee\C-[02w") assert_line_around_cursor('aaa bbb ', 'ccc ddd eee') |
