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:
21
src/eval.c
21
src/eval.c
@@ -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;
|
||||||
|
@@ -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 = []
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user