diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-04-11 13:05:16 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-11 13:05:16 +0100 |
commit | 3caf1cce2b85a8f24195d057f0ad63082543e99e (patch) | |
tree | 1a5639a48592a8b4f4880fe53f4c769a8a0e4d88 | |
parent | 4232dff815db1a727cb1aea26783267d8bd731c3 (diff) |
patch 8.2.4734: getcharpos() may change a mark positionv8.2.4734
Problem: getcharpos() may change a mark position.
Solution: Copy the mark position. (closes #10148)
-rw-r--r-- | src/eval.c | 21 | ||||
-rw-r--r-- | src/testdir/test_cursor_func.vim | 10 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 21 insertions, 12 deletions
diff --git a/src/eval.c b/src/eval.c index b30577fecc..793a5263dd 100644 --- a/src/eval.c +++ b/src/eval.c @@ -5636,34 +5636,35 @@ var2fpos( name = tv_get_string_chk(varp); if (name == NULL) return NULL; + + pos.lnum = 0; if (name[0] == '.' && (!in_vim9script() || name[1] == NUL)) { // 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) pos = VIsual; else 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))) { // mark pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum); if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) return NULL; + pos = *pp; + } + if (pos.lnum != 0) + { if (charcol) - pp->col = buf_byteidx_to_charidx(curbuf, pp->lnum, pp->col); - return pp; + pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col); + return &pos; } pos.coladd = 0; diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim index 7d21d84729..1c26f6d35e 100644 --- a/src/testdir/test_cursor_func.vim +++ b/src/testdir/test_cursor_func.vim @@ -188,12 +188,12 @@ func Test_getcharpos() call assert_fails('call getcharpos({})', 'E731:') call assert_equal([0, 0, 0, 0], getcharpos(0)) new - call setline(1, ['', "01\tà4è678", 'Ⅵ', '012345678']) + call setline(1, ['', "01\tà4è678", 'Ⅵ', '012345678', ' │ x']) " Test for '.' and '$' normal 1G 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 call assert_equal([0, 2, 7, 0], getcharpos('.')) normal 3G$ @@ -207,6 +207,12 @@ func Test_getcharpos() delmarks 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 vnoremap <expr> <F3> SaveVisualStartCharPos() let g:VisualStartPos = [] diff --git a/src/version.c b/src/version.c index cf575d1a5b..5e026de3d4 100644 --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4734, +/**/ 4733, /**/ 4732, |