changeset 31890:2d96d7f9da7e v9.0.1277

patch 9.0.1277: cursor may move with autocmd in Visual mode Commit: https://github.com/vim/vim/commit/49f0524fb575bb1cf4881e472afab7d37c579440 Author: zeertzjq <zeertzjq@outlook.com> 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 04 Feb 2023 12:00:05 +0100
parents 56fd2c6e8425
children 62a6b0f327ba
files src/autocmd.c src/testdir/test_functions.vim src/version.c
diffstat 3 files changed, 16 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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);
 }
--- 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))
 
--- 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,