]> granicus.if.org Git - vim/commitdiff
patch 8.2.3820: "vrc" does not replace composing characters v8.2.3820
authorBram Moolenaar <Bram@vim.org>
Wed, 15 Dec 2021 21:08:50 +0000 (21:08 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 15 Dec 2021 21:08:50 +0000 (21:08 +0000)
Problem:    "vrc" does not replace composing characters, while "rc" does.
Solution:   Check the byte length including composing characters.
            (closes #9351)

src/ops.c
src/testdir/test_visual.vim
src/version.c

index f58d6f8d1dba43e545dbd6b69876819af1ba80ee..714c6bdbe5a11419ed44505317c5fe9874966411 100644 (file)
--- 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
index 0c89dbb0103bcdaa7d5f519e43b4f20192683468..ed8efc5dedf479bd4628af2a01aefd8498ba94d9 100644 (file)
@@ -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')
index f29571e8796bd97528e6283f3caaa212adcb4cba..cde6b4d7c9bc7930375c8cc9136eb09334f79d03 100644 (file)
@@ -749,6 +749,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3820,
 /**/
     3819,
 /**/