mirror of
https://github.com/vim/vim.git
synced 2025-09-30 04:44:14 -04:00
patch 9.0.1717: virtcol2col returns last byte of a multi-byte char
Problem: virtcol2col returns last byte of a multi-byte char Solution: Make it return the first byte for a multi-byte char closes: #12786 closes: #12799 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
committed by
Christian Brabandt
parent
15a0a0281a
commit
b209b86e66
@@ -10347,6 +10347,9 @@ virtcol2col({winid}, {lnum}, {col}) *virtcol2col()*
|
|||||||
{lnum}, then the byte index of the character at the last
|
{lnum}, then the byte index of the character at the last
|
||||||
virtual column is returned.
|
virtual column is returned.
|
||||||
|
|
||||||
|
For a multi-byte character, the column number of the first
|
||||||
|
byte in the character is returned.
|
||||||
|
|
||||||
The {winid} argument can be the window number or the
|
The {winid} argument can be the window number or the
|
||||||
|window-ID|. If this is zero, then the current window is used.
|
|window-ID|. If this is zero, then the current window is used.
|
||||||
|
|
||||||
|
21
src/move.c
21
src/move.c
@@ -1556,6 +1556,25 @@ f_screenpos(typval_T *argvars UNUSED, typval_T *rettv)
|
|||||||
dict_add_number(dict, "endcol", ecol);
|
dict_add_number(dict, "endcol", ecol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a virtual (screen) column to a character column. The first column
|
||||||
|
* is one. For a multibyte character, the column number of the first byte is
|
||||||
|
* returned.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
virtcol2col(win_T *wp, linenr_T lnum, int vcol)
|
||||||
|
{
|
||||||
|
int offset = vcol2col(wp, lnum, vcol);
|
||||||
|
char_u *line = ml_get_buf(wp->w_buffer, lnum, FALSE);
|
||||||
|
char_u *p = line + offset;
|
||||||
|
|
||||||
|
// For a multibyte character, need to return the column number of the first
|
||||||
|
// byte.
|
||||||
|
MB_PTR_BACK(line, p);
|
||||||
|
|
||||||
|
return (int)(p - line + 1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "virtcol2col({winid}, {lnum}, {col})" function
|
* "virtcol2col({winid}, {lnum}, {col})" function
|
||||||
*/
|
*/
|
||||||
@@ -1586,7 +1605,7 @@ f_virtcol2col(typval_T *argvars UNUSED, typval_T *rettv)
|
|||||||
if (error || screencol < 0)
|
if (error || screencol < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rettv->vval.v_number = vcol2col(wp, lnum, screencol);
|
rettv->vval.v_number = virtcol2col(wp, lnum, screencol);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -531,6 +531,15 @@ func Test_virtcol2col()
|
|||||||
call assert_equal(-1, virtcol2col(0, -1, 1))
|
call assert_equal(-1, virtcol2col(0, -1, 1))
|
||||||
call assert_equal(-1, virtcol2col(0, 1, -1))
|
call assert_equal(-1, virtcol2col(0, 1, -1))
|
||||||
call assert_equal(5, virtcol2col(0, 1, 20))
|
call assert_equal(5, virtcol2col(0, 1, 20))
|
||||||
|
|
||||||
|
" Multibyte character
|
||||||
|
call setline(1, ['a✅✅✅'])
|
||||||
|
call assert_equal(1, virtcol2col(0, 1, 1))
|
||||||
|
call assert_equal(2, virtcol2col(0, 1, 3))
|
||||||
|
call assert_equal(5, virtcol2col(0, 1, 5))
|
||||||
|
call assert_equal(8, virtcol2col(0, 1, 7))
|
||||||
|
call assert_equal(8, virtcol2col(0, 1, 8))
|
||||||
|
|
||||||
call assert_fails('echo virtcol2col("0", 1, 20)', 'E1210:')
|
call assert_fails('echo virtcol2col("0", 1, 20)', 'E1210:')
|
||||||
call assert_fails('echo virtcol2col(0, "1", 20)', 'E1210:')
|
call assert_fails('echo virtcol2col(0, "1", 20)', 'E1210:')
|
||||||
call assert_fails('echo virtcol2col(0, 1, "1")', 'E1210:')
|
call assert_fails('echo virtcol2col(0, 1, "1")', 'E1210:')
|
||||||
|
@@ -695,6 +695,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 */
|
||||||
|
/**/
|
||||||
|
1717,
|
||||||
/**/
|
/**/
|
||||||
1716,
|
1716,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user