changeset 26581:8da90cdcec68 v8.2.3820

patch 8.2.3820: "vrc" does not replace composing characters Commit: https://github.com/vim/vim/commit/8ee6028de3daa9af9e5f90fa9e583ff407bee04f Author: Bram Moolenaar <Bram@vim.org> Date: Wed Dec 15 21:08:50 2021 +0000 patch 8.2.3820: "vrc" does not replace composing characters Problem: "vrc" does not replace composing characters, while "rc" does. Solution: Check the byte length including composing characters. (closes #9351)
author Bram Moolenaar <Bram@vim.org>
date Wed, 15 Dec 2021 22:15:18 +0100
parents d7b97e7eaf18
children d83c787c447c
files src/ops.c src/testdir/test_visual.vim src/version.c
diffstat 3 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ops.c
+++ b/src/ops.c
@@ -1162,12 +1162,15 @@ op_replace(oparg_T *oap, int c)
 	    n = gchar_cursor();
 	    if (n != NUL)
 	    {
-		if ((*mb_char2len)(c) > 1 || (*mb_char2len)(n) > 1)
+		int new_byte_len = (*mb_char2len)(c);
+		int old_byte_len = mb_ptr2len(ml_get_cursor());
+
+		if (new_byte_len > 1 || old_byte_len > 1)
 		{
 		    // This is slow, but it handles replacing a single-byte
 		    // with a multi-byte and the other way around.
 		    if (curwin->w_cursor.lnum == oap->end.lnum)
-			oap->end.col += (*mb_char2len)(c) - (*mb_char2len)(n);
+			oap->end.col += new_byte_len - old_byte_len;
 		    replace_character(c);
 		}
 		else
--- a/src/testdir/test_visual.vim
+++ b/src/testdir/test_visual.vim
@@ -234,6 +234,10 @@ func Test_virtual_replace()
   call assert_equal("\txaaaa", getline(1))
   set softtabstop&
 
+  call setline(1, "xã̳x")
+  normal gg0lvrb
+  call assert_equal("xbx", getline(1))
+
   enew!
   set noai bs&vim
   if exists('save_t_kD')
--- a/src/version.c
+++ b/src/version.c
@@ -750,6 +750,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3820,
+/**/
     3819,
 /**/
     3818,