# HG changeset patch # User Bram Moolenaar # Date 1551954615 -3600 # Node ID e91750e8adb59aac93bbe8b484609ca3268feb1f # Parent 9a4cfad3713a8de7e96ac491ac9fe18ecfee73f3 patch 8.1.0998: getcurpos() unexpectedly changes "curswant" commit https://github.com/vim/vim/commit/19a66858a5e3fedadc371321834507c34e2dfb18 Author: Bram Moolenaar 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) diff --git a/src/evalfunc.c b/src/evalfunc.c --- 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 diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim --- 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\jI123 \j", 'xt') + call assert_equal([0, 2, 1, 0, 1], getcurpos()) + + bwipe! + au! InsertLeave +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -780,6 +780,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 998, +/**/ 997, /**/ 996,