]> granicus.if.org Git - vim/commitdiff
patch 9.0.0077: wrong restored cursor position when switching window in autocmd v9.0.0077
authorBram Moolenaar <Bram@vim.org>
Tue, 26 Jul 2022 12:47:13 +0000 (13:47 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 26 Jul 2022 12:47:13 +0000 (13:47 +0100)
Problem:    When switching window in autocmd the restored cursor position may
            be wrong.
Solution:   Do not restore the cursor if it was not set. (closes #10775)

src/testdir/dumps/Test_autocmd_nested_switch.dump [new file with mode: 0644]
src/testdir/test_autocmd.vim
src/version.c
src/window.c

diff --git a/src/testdir/dumps/Test_autocmd_nested_switch.dump b/src/testdir/dumps/Test_autocmd_nested_switch.dump
new file mode 100644 (file)
index 0000000..499653e
--- /dev/null
@@ -0,0 +1,10 @@
+>(+0&#ffffff0|)| @72
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|X+3#0000000&|a|u|t|o|f|i|l|e| @47|1|,|1| @11|A|l@1
+|(+0&&|)| @72
+|~+0#4040ff13&| @73
+|~| @73
+|X+1#0000000&|a|u|t|o|f|i|l|e| @47|1|,|1| @11|A|l@1
+|"+0&&|X|a|u|t|o|f|i|l|e|"| |1|L|,| |3|B| @56
index 1202c058dadc88e8cc5e226a47599a1d48c70401..bd68ae386a699995d110db43d75d29815a0fecfa 100644 (file)
@@ -2317,9 +2317,30 @@ func Test_autocmd_nested_cursor_invalid()
     au!
   augroup END
   set laststatus&
+  cclose
   bwipe!
 endfunc
 
+func Test_autocmd_nested_switch_window()
+  " run this in a separate Vim so that SafeState works
+  CheckRunVimInTerminal
+
+  let lines =<< trim END
+      vim9script
+      ['()']->writefile('Xautofile')
+      autocmd VimEnter * ++nested edit Xautofile | split
+      autocmd BufReadPost * autocmd SafeState * ++once foldclosed('.')
+      autocmd WinEnter * matchadd('ErrorMsg', 'pat')
+  END
+  call writefile(lines, 'Xautoscript')
+  let buf = RunVimInTerminal('-S Xautoscript', {'rows': 10})
+  call VerifyScreenDump(buf, 'Test_autocmd_nested_switch', {})
+
+  call StopVimInTerminal(buf)
+  call delete('Xautofile')
+  call delete('Xautoscript')
+endfunc
+
 func Test_autocmd_once()
   " Without ++once WinNew triggers twice
   let g:did_split = 0
@@ -2631,7 +2652,6 @@ endfunc
 
 func Test_autocmd_SafeState()
   CheckRunVimInTerminal
-  let g:test_is_flaky = 1
 
   let lines =<< trim END
        let g:safe = 0
index 9081fecd11043ec6cb68d3821bfe2c1f27724f8e..08039d9ebedc3bab8150e4748bad49396f3719b9 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    77,
 /**/
     76,
 /**/
index e7b44abd16b660f5e0284124d1c470b49ab9f8f7..83cc24e23fad392424fd7b7fa6b53d6ab6e7776f 100644 (file)
@@ -6832,10 +6832,13 @@ reset_lnums()
     FOR_ALL_TAB_WINDOWS(tp, wp)
        if (wp->w_buffer == curbuf)
        {
-           // Restore the value if the autocommand didn't change it.
-           if (EQUAL_POS(wp->w_save_cursor.w_cursor_corr, wp->w_cursor))
+           // Restore the value if the autocommand didn't change it and it was
+           // set.
+           if (EQUAL_POS(wp->w_save_cursor.w_cursor_corr, wp->w_cursor)
+                                 && wp->w_save_cursor.w_cursor_save.lnum != 0)
                wp->w_cursor = wp->w_save_cursor.w_cursor_save;
-           if (wp->w_save_cursor.w_topline_corr == wp->w_topline)
+           if (wp->w_save_cursor.w_topline_corr == wp->w_topline
+                                     && wp->w_save_cursor.w_topline_save != 0)
                wp->w_topline = wp->w_save_cursor.w_topline_save;
        }
 }