Mercurial > vim
changeset 15985:e91750e8adb5 v8.1.0998
patch 8.1.0998: getcurpos() unexpectedly changes "curswant"
commit https://github.com/vim/vim/commit/19a66858a5e3fedadc371321834507c34e2dfb18
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Mar 7 11:25:32 2019 +0100
patch 8.1.0998: getcurpos() unexpectedly changes "curswant"
Problem: getcurpos() unexpectedly changes "curswant".
Solution: Save and restore "curswant". (closes https://github.com/vim/vim/issues/4069)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 07 Mar 2019 11:30:15 +0100 |
parents | 9a4cfad3713a |
children | 77b7032bb373 |
files | src/evalfunc.c src/testdir/test_visual.vim src/version.c |
diffstat | 3 files changed, 27 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -5474,9 +5474,23 @@ getpos_both( (varnumber_T)0); if (getcurpos) { + int save_set_curswant = curwin->w_set_curswant; + colnr_T save_curswant = curwin->w_curswant; + colnr_T save_virtcol = curwin->w_virtcol; + update_curswant(); list_append_number(l, curwin->w_curswant == MAXCOL ? (varnumber_T)MAXCOL : (varnumber_T)curwin->w_curswant + 1); + + // Do not change "curswant", as it is unexpected that a get + // function has a side effect. + if (save_set_curswant) + { + curwin->w_set_curswant = save_set_curswant; + curwin->w_curswant = save_curswant; + curwin->w_virtcol = save_virtcol; + curwin->w_valid &= ~VALID_VIRTCOL; + } } } else
--- a/src/testdir/test_visual.vim +++ b/src/testdir/test_visual.vim @@ -1,8 +1,4 @@ " Tests for various Visual mode. -if !has('visual') - finish -endif - func Test_block_shift_multibyte() " Uses double-wide character. @@ -397,3 +393,14 @@ func Test_Visual_paragraph_textobject() bwipe! endfunc + +func Test_curswant_not_changed() + new + call setline(1, ['one', 'two']) + au InsertLeave * call getcurpos() + call feedkeys("gg0\<C-V>jI123 \<Esc>j", 'xt') + call assert_equal([0, 2, 1, 0, 1], getcurpos()) + + bwipe! + au! InsertLeave +endfunc