# HG changeset patch # User Bram Moolenaar # Date 1675508405 -3600 # Node ID 2d96d7f9da7eaa0a0a6d054b10488b5a40f3cb64 # Parent 56fd2c6e8425b124a78eead5e4c0a34defd38e2e patch 9.0.1277: cursor may move with autocmd in Visual mode Commit: https://github.com/vim/vim/commit/49f0524fb575bb1cf4881e472afab7d37c579440 Author: zeertzjq Date: Sat Feb 4 10:58:34 2023 +0000 patch 9.0.1277: cursor may move with autocmd in Visual mode Problem: Cursor may move with autocmd in Visual mode. Solution: Restore "VIsual_active" before calling check_cursor(). (closes #11939) diff --git a/src/autocmd.c b/src/autocmd.c --- a/src/autocmd.c +++ b/src/autocmd.c @@ -1695,6 +1695,7 @@ win_found: globaldir = aco->globaldir; // the buffer contents may have changed + VIsual_active = aco->save_VIsual_active; check_cursor(); if (curwin->w_topline > curbuf->b_ml.ml_line_count) { @@ -1741,14 +1742,16 @@ win_found: curwin = save_curwin; curbuf = curwin->w_buffer; prevwin = win_find_by_id(aco->save_prevwin_id); + // In case the autocommand moves the cursor to a position that // does not exist in curbuf. + VIsual_active = aco->save_VIsual_active; check_cursor(); } } + VIsual_active = aco->save_VIsual_active; check_cursor(); // just in case lines got deleted - VIsual_active = aco->save_VIsual_active; if (VIsual_active) check_pos(curbuf, &VIsual); } diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -1648,7 +1648,7 @@ endfunc func Test_setbufvar_options() " This tests that aucmd_prepbuf() and aucmd_restbuf() properly restore the - " window layout. + " window layout and cursor position. call assert_equal(1, winnr('$')) split dummy_preview resize 2 @@ -1662,11 +1662,20 @@ func Test_setbufvar_options() execute 'belowright vertical split #' . dummy_buf call assert_equal(wh, winheight(0)) let dum1_id = win_getid() + call setline(1, 'foo') + normal! V$ + call assert_equal(4, col('.')) + call setbufvar('dummy_preview', '&buftype', 'nofile') + call assert_equal(4, col('.')) wincmd h let wh = winheight(0) + call setline(1, 'foo') + normal! V$ + call assert_equal(4, col('.')) let dummy_buf = bufnr('dummy_buf2', v:true) eval 'nofile'->setbufvar(dummy_buf, '&buftype') + call assert_equal(4, col('.')) execute 'belowright vertical split #' . dummy_buf call assert_equal(wh, winheight(0)) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1277, +/**/ 1276, /**/ 1275,