diff --git a/src/nvim/insert.c b/src/nvim/insert.c index 0dc5edde49..d5cd4879e1 100644 --- a/src/nvim/insert.c +++ b/src/nvim/insert.c @@ -2906,7 +2906,7 @@ static void replace_do_bs(int limit_col) int vcol = start_vcol; for (int i = 0; i < ins_len; i++) { vcol += win_chartabsize(curwin, p + i, vcol); - i += utfc_ptr2len(p) - 1; + i += utfc_ptr2len(p + i) - 1; } vcol -= start_vcol; diff --git a/test/old/testdir/test_edit.vim b/test/old/testdir/test_edit.vim index e886089d26..7682f77cb0 100644 --- a/test/old/testdir/test_edit.vim +++ b/test/old/testdir/test_edit.vim @@ -1824,6 +1824,20 @@ func Test_edit_startinsert_in_terminal() bwipe! endfunc +" Backspacing in Virtual Replace mode over a wide character that replaced +" several narrower ones must not eat the padding that follows. +func Test_edit_vreplace_bs_multibyte() + new + call setline(1, 'aé xyz') + call feedkeys("gR\u4e00\\e", 'xt') + call assert_equal('aé xyz', getline(1)) + + call setline(1, 'a€ xyz') + call feedkeys("gR\u4e00\\e", 'xt') + call assert_equal('a€ xyz', getline(1)) + bwipe! +endfunc + " Test for :startreplace and :startgreplace func Test_edit_startreplace() new