summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2020-11-02 21:57:54 +0900
committeraycabta <aycabta@gmail.com>2020-12-05 02:58:58 +0900
commit6be3b2da19a45e21c63ed0a9c51fa4e1a0d1bd08 (patch)
tree884823c985878c72aba957dfc19d3ba75e637fe0
parent2dc4aca8d18ae8b5159da22c5d02b3052a7ac4ec (diff)
[ruby/reline] Implement vi_yank
https://github.com/ruby/reline/commit/164aaf9a5f
-rw-r--r--lib/reline/line_editor.rb8
-rw-r--r--test/reline/test_key_actor_vi.rb18
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 86d57d905b..8425a475d6 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -2083,6 +2083,14 @@ class Reline::LineEditor
end
private def vi_yank(key)
+ @waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff|
+ if byte_pointer_diff > 0
+ cut = @line.byteslice(@byte_pointer, byte_pointer_diff)
+ elsif byte_pointer_diff < 0
+ cut = @line.byteslice(@byte_pointer + byte_pointer_diff, -byte_pointer_diff)
+ end
+ copy_for_vi(cut)
+ }
end
private def vi_list_or_eof(key)
diff --git a/test/reline/test_key_actor_vi.rb b/test/reline/test_key_actor_vi.rb
index a244927999..6f318db46c 100644
--- a/test/reline/test_key_actor_vi.rb
+++ b/test/reline/test_key_actor_vi.rb
@@ -1276,4 +1276,22 @@ class Reline::KeyActor::ViInsert::Test < Reline::TestCase
assert_cursor_max(3)
assert_line('abc')
end
+
+ def test_vi_yank
+ input_keys("foo bar\C-[0")
+ assert_line('foo bar')
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(7)
+ input_keys('y3l')
+ assert_line('foo bar')
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(7)
+ input_keys('P')
+ assert_line('foofoo bar')
+ assert_byte_pointer_size('fo')
+ assert_cursor(2)
+ assert_cursor_max(10)
+ end
end