summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/reline/line_editor.rb1
-rw-r--r--test/reline/test_key_actor_emacs.rb76
2 files changed, 77 insertions, 0 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 568cea8bd4..c5f00c28dc 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -1418,6 +1418,7 @@ class Reline::LineEditor
middle = @line.byteslice(middle_start, right_word_start - middle_start)
right_word = @line.byteslice(right_word_start, after_start - right_word_start)
after = @line.byteslice(after_start, @line.bytesize - after_start)
+ return if left_word.empty? or right_word.empty?
@line = before + right_word + middle + left_word + after
from_head_to_left_word = before + right_word + middle + left_word
@byte_pointer = from_head_to_left_word.bytesize
diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb
index 4194659631..04edf6b31f 100644
--- a/test/reline/test_key_actor_emacs.rb
+++ b/test/reline/test_key_actor_emacs.rb
@@ -903,6 +903,82 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
assert_cursor_max(18)
end
+ def test_ed_transpose_words_with_one_word
+ input_keys('abc ')
+ assert_line('abc ')
+ assert_byte_pointer_size('abc ')
+ assert_cursor(5)
+ assert_cursor_max(5)
+ input_keys("\M-t", false)
+ assert_line('abc ')
+ assert_byte_pointer_size('abc ')
+ assert_cursor(5)
+ assert_cursor_max(5)
+ input_keys("\C-b", false)
+ assert_line('abc ')
+ assert_byte_pointer_size('abc ')
+ assert_cursor(4)
+ assert_cursor_max(5)
+ input_keys("\M-t", false)
+ assert_line('abc ')
+ assert_byte_pointer_size('abc ')
+ assert_cursor(4)
+ assert_cursor_max(5)
+ input_keys("\C-b" * 2, false)
+ assert_line('abc ')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(5)
+ input_keys("\M-t", false)
+ assert_line('abc ')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(5)
+ input_keys("\M-t", false)
+ assert_line('abc ')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(5)
+ end
+
+ def test_ed_transpose_words_with_one_word_for_mbchar
+ input_keys('あいう ')
+ assert_line('あいう ')
+ assert_byte_pointer_size('あいう ')
+ assert_cursor(8)
+ assert_cursor_max(8)
+ input_keys("\M-t", false)
+ assert_line('あいう ')
+ assert_byte_pointer_size('あいう ')
+ assert_cursor(8)
+ assert_cursor_max(8)
+ input_keys("\C-b", false)
+ assert_line('あいう ')
+ assert_byte_pointer_size('あいう ')
+ assert_cursor(7)
+ assert_cursor_max(8)
+ input_keys("\M-t", false)
+ assert_line('あいう ')
+ assert_byte_pointer_size('あいう ')
+ assert_cursor(7)
+ assert_cursor_max(8)
+ input_keys("\C-b" * 2, false)
+ assert_line('あいう ')
+ assert_byte_pointer_size('あい')
+ assert_cursor(4)
+ assert_cursor_max(8)
+ input_keys("\M-t", false)
+ assert_line('あいう ')
+ assert_byte_pointer_size('あい')
+ assert_cursor(4)
+ assert_cursor_max(8)
+ input_keys("\M-t", false)
+ assert_line('あいう ')
+ assert_byte_pointer_size('あい')
+ assert_cursor(4)
+ assert_cursor_max(8)
+ end
+
def test_ed_digit
input_keys('0123')
assert_byte_pointer_size('0123')