]> granicus.if.org Git - vim/commitdiff
patch 9.0.1277: cursor may move with autocmd in Visual mode v9.0.1277
authorzeertzjq <zeertzjq@outlook.com>
Sat, 4 Feb 2023 10:58:34 +0000 (10:58 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 4 Feb 2023 10:58:34 +0000 (10:58 +0000)
Problem:    Cursor may move with autocmd in Visual mode.
Solution:   Restore "VIsual_active" before calling check_cursor().
            (closes #11939)

src/autocmd.c
src/testdir/test_functions.vim
src/version.c

index c18d2a15ab924ac72dd84d45119710f9dc0c4abf..a409379b6192eb010e539368baf97e33b1c761bd 100644 (file)
@@ -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();
        }
     }
 
-    check_cursor();        // just in case lines got deleted
     VIsual_active = aco->save_VIsual_active;
+    check_cursor();        // just in case lines got deleted
     if (VIsual_active)
        check_pos(curbuf, &VIsual);
 }
index 99403e295aa82cd628319adcc9908f04c13d6f5d..3bea88df17ce7617dc21fe03335cfe422074e012 100644 (file)
@@ -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))
 
index 5bf3348d29703d41d7f9afd71b5b69fa825eb819..0768881b996ff24024849aa09b42545b06a7f81e 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1277,
 /**/
     1276,
 /**/