0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.2.4734: getcharpos() may change a mark position

Problem:    getcharpos() may change a mark position.
Solution:   Copy the mark position. (closes #10148)
This commit is contained in:
Bram Moolenaar
2022-04-11 13:05:16 +01:00
parent 4232dff815
commit 3caf1cce2b
3 changed files with 21 additions and 12 deletions

View File

@@ -5636,34 +5636,35 @@ var2fpos(
name = tv_get_string_chk(varp); name = tv_get_string_chk(varp);
if (name == NULL) if (name == NULL)
return NULL; return NULL;
pos.lnum = 0;
if (name[0] == '.' && (!in_vim9script() || name[1] == NUL)) if (name[0] == '.' && (!in_vim9script() || name[1] == NUL))
{ {
// cursor // cursor
pos = curwin->w_cursor; pos = curwin->w_cursor;
if (charcol)
pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
return &pos;
} }
if (name[0] == 'v' && name[1] == NUL) // Visual start else if (name[0] == 'v' && name[1] == NUL)
{ {
// Visual start
if (VIsual_active) if (VIsual_active)
pos = VIsual; pos = VIsual;
else else
pos = curwin->w_cursor; pos = curwin->w_cursor;
if (charcol)
pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
return &pos;
} }
if (name[0] == '\'' && (!in_vim9script() else if (name[0] == '\'' && (!in_vim9script()
|| (name[1] != NUL && name[2] == NUL))) || (name[1] != NUL && name[2] == NUL)))
{ {
// mark // mark
pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum); pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum);
if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
return NULL; return NULL;
pos = *pp;
}
if (pos.lnum != 0)
{
if (charcol) if (charcol)
pp->col = buf_byteidx_to_charidx(curbuf, pp->lnum, pp->col); pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
return pp; return &pos;
} }
pos.coladd = 0; pos.coladd = 0;

View File

@@ -188,12 +188,12 @@ func Test_getcharpos()
call assert_fails('call getcharpos({})', 'E731:') call assert_fails('call getcharpos({})', 'E731:')
call assert_equal([0, 0, 0, 0], getcharpos(0)) call assert_equal([0, 0, 0, 0], getcharpos(0))
new new
call setline(1, ['', "01\tà4è678", 'Ⅵ', '012345678']) call setline(1, ['', "01\tà4è678", 'Ⅵ', '012345678', ' │ x'])
" Test for '.' and '$' " Test for '.' and '$'
normal 1G normal 1G
call assert_equal([0, 1, 1, 0], getcharpos('.')) call assert_equal([0, 1, 1, 0], getcharpos('.'))
call assert_equal([0, 4, 1, 0], getcharpos('$')) call assert_equal([0, 5, 1, 0], getcharpos('$'))
normal 2G6l normal 2G6l
call assert_equal([0, 2, 7, 0], getcharpos('.')) call assert_equal([0, 2, 7, 0], getcharpos('.'))
normal 3G$ normal 3G$
@@ -207,6 +207,12 @@ func Test_getcharpos()
delmarks m delmarks m
call assert_equal([0, 0, 0, 0], getcharpos("'m")) call assert_equal([0, 0, 0, 0], getcharpos("'m"))
" Check mark does not move
normal 5Gfxma
call assert_equal([0, 5, 5, 0], getcharpos("'a"))
call assert_equal([0, 5, 5, 0], getcharpos("'a"))
call assert_equal([0, 5, 5, 0], getcharpos("'a"))
" Test for the visual start column " Test for the visual start column
vnoremap <expr> <F3> SaveVisualStartCharPos() vnoremap <expr> <F3> SaveVisualStartCharPos()
let g:VisualStartPos = [] let g:VisualStartPos = []

View File

@@ -746,6 +746,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 */
/**/
4734,
/**/ /**/
4733, 4733,
/**/ /**/