1
0
forked from aniani/vim

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)
This commit is contained in:
Bram Moolenaar 2021-12-15 21:08:50 +00:00
parent 427f065a88
commit 8ee6028de3
3 changed files with 11 additions and 2 deletions

View File

@ -1162,12 +1162,15 @@ op_replace(oparg_T *oap, int c)
n = gchar_cursor(); n = gchar_cursor();
if (n != NUL) 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 // This is slow, but it handles replacing a single-byte
// with a multi-byte and the other way around. // with a multi-byte and the other way around.
if (curwin->w_cursor.lnum == oap->end.lnum) 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); replace_character(c);
} }
else else

View File

@ -234,6 +234,10 @@ func Test_virtual_replace()
call assert_equal("\txaaaa", getline(1)) call assert_equal("\txaaaa", getline(1))
set softtabstop& set softtabstop&
call setline(1, "xã̳x")
normal gg0lvrb
call assert_equal("xbx", getline(1))
enew! enew!
set noai bs&vim set noai bs&vim
if exists('save_t_kD') if exists('save_t_kD')

View File

@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3820,
/**/ /**/
3819, 3819,
/**/ /**/