To: vim_dev@googlegroups.com Subject: Patch 8.2.4734 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4734 Problem: getcharpos() may change a mark position. Solution: Copy the mark position. (closes #10148) Files: src/eval.c, src/testdir/test_cursor_func.vim *** ../vim-8.2.4733/src/eval.c 2022-04-04 14:58:02.166539812 +0100 --- src/eval.c 2022-04-11 13:04:43.895699670 +0100 *************** *** 5636,5669 **** name = tv_get_string_chk(varp); if (name == NULL) return NULL; 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 { 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() || (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; if (charcol) ! pp->col = buf_byteidx_to_charidx(curbuf, pp->lnum, pp->col); ! return pp; } pos.coladd = 0; --- 5636,5670 ---- 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; } ! else if (name[0] == 'v' && name[1] == NUL) { + // Visual start if (VIsual_active) pos = VIsual; else pos = curwin->w_cursor; } ! 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) ! pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col); ! return &pos; } pos.coladd = 0; *** ../vim-8.2.4733/src/testdir/test_cursor_func.vim 2022-02-15 13:40:13.508939677 +0000 --- src/testdir/test_cursor_func.vim 2022-04-11 12:40:43.509892656 +0100 *************** *** 188,199 **** call assert_fails('call getcharpos({})', 'E731:') call assert_equal([0, 0, 0, 0], getcharpos(0)) new ! call setline(1, ['', "01\tà4è678", 'Ⅵ', '012345678']) " Test for '.' and '$' normal 1G call assert_equal([0, 1, 1, 0], getcharpos('.')) ! call assert_equal([0, 4, 1, 0], getcharpos('$')) normal 2G6l call assert_equal([0, 2, 7, 0], getcharpos('.')) normal 3G$ --- 188,199 ---- call assert_fails('call getcharpos({})', 'E731:') call assert_equal([0, 0, 0, 0], getcharpos(0)) new ! 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, 5, 1, 0], getcharpos('$')) normal 2G6l call assert_equal([0, 2, 7, 0], getcharpos('.')) normal 3G$ *************** *** 207,212 **** --- 207,218 ---- 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 SaveVisualStartCharPos() let g:VisualStartPos = [] *** ../vim-8.2.4733/src/version.c 2022-04-11 11:37:07.994510794 +0100 --- src/version.c 2022-04-11 12:43:32.869853968 +0100 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 4734, /**/ -- ARTHUR: Now stand aside worthy adversary. BLACK KNIGHT: (Glancing at his shoulder) 'Tis but a scratch. ARTHUR: A scratch? Your arm's off. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///