mirror of
https://github.com/vim/vim
synced 2025-07-16 01:01:58 +00:00
patch 9.1.1083: setreg() doesn't correctly handle mbyte chars in blockwise mode
Problem: setreg() doesn't correctly handle mbyte chars in blockwise mode Solution: use mb_ptr2len_len function pointer (Yee Cheng Chin) setreg() will automatically calculate the width when a blockwise mode is specified, but it does not properly calculate the line widths of mbyte characters when value is passed as newline-terminated string. It does work when value is passed as a list of lines though. Fix this by properly using the mbyte function pointer to increment the loop counter. closes: #16596 Signed-off-by: Yee Cheng Chin <ychin.git@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
a6d5778d9b
commit
a17f8bfb28
@ -3019,12 +3019,17 @@ str_to_reg(
|
||||
{
|
||||
int charlen = 0;
|
||||
|
||||
for (i = start; i < len; ++i) // find the end of the line
|
||||
for (i = start; i < len;) // find the end of the line
|
||||
{
|
||||
if (str[i] == '\n')
|
||||
break;
|
||||
if (type == MBLOCK)
|
||||
charlen += mb_ptr2cells_len(str + i, len - i);
|
||||
|
||||
if (str[i] == NUL)
|
||||
i++; // registers can have NUL chars
|
||||
else
|
||||
i += mb_ptr2len_len(str + i, len - i);
|
||||
}
|
||||
i -= start; // i is now length of line
|
||||
if (charlen > maxlen)
|
||||
|
@ -431,6 +431,23 @@ func Test_set_register()
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
" Test for blockwise register width calculations
|
||||
func Test_set_register_blockwise_width()
|
||||
" Test for regular calculations and overriding the width
|
||||
call setreg('a', "12\n1234\n123", 'b')
|
||||
call assert_equal("\<c-v>4", getreginfo('a').regtype)
|
||||
call setreg('a', "12\n1234\n123", 'b1')
|
||||
call assert_equal("\<c-v>1", getreginfo('a').regtype)
|
||||
call setreg('a', "12\n1234\n123", 'b6')
|
||||
call assert_equal("\<c-v>6", getreginfo('a').regtype)
|
||||
|
||||
" Test for Unicode parsing
|
||||
call setreg('a', "z😅😅z\n12345", 'b')
|
||||
call assert_equal("\<c-v>6", getreginfo('a').regtype)
|
||||
call setreg('a', ["z😅😅z", "12345"], 'b')
|
||||
call assert_equal("\<c-v>6", getreginfo('a').regtype)
|
||||
endfunc
|
||||
|
||||
" Test for clipboard registers (* and +)
|
||||
func Test_clipboard_regs()
|
||||
CheckNotGui
|
||||
|
@ -704,6 +704,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1083,
|
||||
/**/
|
||||
1082,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user