changeset 29471:9ada26920941 v9.0.0077

patch 9.0.0077: wrong restored cursor position when switching window in autocmd Commit: https://github.com/vim/vim/commit/b03950fafa07e8b8d975eeb345ad08b8b62e67ce Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jul 26 13:47:13 2022 +0100 patch 9.0.0077: wrong restored cursor position when switching window in autocmd 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)
author Bram Moolenaar <Bram@vim.org>
date Tue, 26 Jul 2022 15:00:05 +0200
parents 513b1ece5ce2
children 1a227a808854
files src/testdir/dumps/Test_autocmd_nested_switch.dump src/testdir/test_autocmd.vim src/version.c src/window.c
diffstat 4 files changed, 39 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/src/testdir/dumps/Test_autocmd_nested_switch.dump
@@ -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
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    77,
+/**/
     76,
 /**/
     75,
--- a/src/window.c
+++ b/src/window.c
@@ -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;
 	}
 }