summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-07-26 13:47:13 +0100
committerBram Moolenaar <Bram@vim.org>2022-07-26 13:47:13 +0100
commitb03950fafa07e8b8d975eeb345ad08b8b62e67ce (patch)
tree887d38e97a9249733cbf43b6a3178e45a0cae90a
parent92a1678d488b7d023ddf2cd493a6ee0d7fcf1928 (diff)
downloadvim-git-9.0.0077.tar.gz
patch 9.0.0077: wrong restored cursor position when switching window in autocmdv9.0.0077
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)
-rw-r--r--src/testdir/dumps/Test_autocmd_nested_switch.dump10
-rw-r--r--src/testdir/test_autocmd.vim22
-rw-r--r--src/version.c2
-rw-r--r--src/window.c9
4 files changed, 39 insertions, 4 deletions
diff --git a/src/testdir/dumps/Test_autocmd_nested_switch.dump b/src/testdir/dumps/Test_autocmd_nested_switch.dump
new file mode 100644
index 000000000..499653e09
--- /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
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 1202c058d..bd68ae386 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 9081fecd1..08039d9eb 100644
--- 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,
diff --git a/src/window.c b/src/window.c
index e7b44abd1..83cc24e23 100644
--- 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;
}
}