diff options
-rw-r--r-- | src/nvim/ops.c | 14 | ||||
-rw-r--r-- | src/nvim/testdir/Makefile | 1 | ||||
-rw-r--r-- | src/nvim/testdir/test_visual.vim | 18 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
4 files changed, 30 insertions, 5 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 25b3b85497..e8a79fa820 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -339,10 +339,16 @@ static void shift_block(oparg_T *oap, int amount) total += bd.pre_whitesp; /* all virtual WS up to & incl a split TAB */ ws_vcol = bd.start_vcol - bd.pre_whitesp; if (bd.startspaces) { - if (has_mbyte) - bd.textstart += (*mb_ptr2len)(bd.textstart); - else - ++bd.textstart; + if (has_mbyte) { + if ((*mb_ptr2len)(bd.textstart) == 1) { + bd.textstart++; + } else { + ws_vcol = 0; + bd.startspaces = 0; + } + } else { + bd.textstart++; + } } for (; ascii_iswhite(*bd.textstart); ) { // TODO: is passing bd.textstart for start of the line OK? diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile index 30f5170565..fb0079111c 100644 --- a/src/nvim/testdir/Makefile +++ b/src/nvim/testdir/Makefile @@ -39,6 +39,7 @@ NEW_TESTS = \ test_syntax.res \ test_timers.res \ test_viml.res \ + test_visual.res \ test_alot.res SCRIPTS_GUI := test16.out diff --git a/src/nvim/testdir/test_visual.vim b/src/nvim/testdir/test_visual.vim new file mode 100644 index 0000000000..83bae967e2 --- /dev/null +++ b/src/nvim/testdir/test_visual.vim @@ -0,0 +1,18 @@ +" Tests for Visual mode +if !has('multi_byte') + finish +endif +scriptencoding utf-8 + +if !has('visual') + finish +endif + +func Test_block_shift_multibyte() + split + call setline(1, ['xヹxxx', 'ヹxxx']) + exe "normal 1G0l\<C-V>jl>" + call assert_equal('x ヹxxx', getline(1)) + call assert_equal(' ヹxxx', getline(2)) + q! +endfunc diff --git a/src/nvim/version.c b/src/nvim/version.c index d99f4dc6ba..527ef3b9ad 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -208,7 +208,7 @@ static int included_patches[] = { // 1494, // 1493 NA 1492, - // 1491, + 1491, // 1490 NA // 1489 NA // 1488 NA |