diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-07-26 13:47:13 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-07-26 13:47:13 +0100 |
commit | b03950fafa07e8b8d975eeb345ad08b8b62e67ce (patch) | |
tree | 887d38e97a9249733cbf43b6a3178e45a0cae90a | |
parent | 92a1678d488b7d023ddf2cd493a6ee0d7fcf1928 (diff) | |
download | vim-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.dump | 10 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 22 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/window.c | 9 |
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; } } |