diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-07-28 11:24:32 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-07-28 11:38:02 +0800 |
commit | 394d65494aead6ee07298e19d53c99603b11471d (patch) | |
tree | fe2fd5cbab2c322cbd3a8f6fdbe248f4b18ad42a /src | |
parent | 8e67af1b201adfca9f6c3589b4f7c59b323e9459 (diff) | |
download | rneovim-394d65494aead6ee07298e19d53c99603b11471d.tar.gz rneovim-394d65494aead6ee07298e19d53c99603b11471d.tar.bz2 rneovim-394d65494aead6ee07298e19d53c99603b11471d.zip |
vim-patch:partial: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 vim/vim#10775)
https://github.com/vim/vim/commit/b03950fafa07e8b8d975eeb345ad08b8b62e67ce
This patch cannot be fully ported because it depends on patch 8.2.3518.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/testdir/test_autocmd.vim | 21 | ||||
-rw-r--r-- | src/nvim/window.c | 9 |
2 files changed, 27 insertions, 3 deletions
diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim index 0c13331e6a..7645a27fdf 100644 --- a/src/nvim/testdir/test_autocmd.vim +++ b/src/nvim/testdir/test_autocmd.vim @@ -2186,9 +2186,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 diff --git a/src/nvim/window.c b/src/nvim/window.c index 09125e13c8..a825a77f5f 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -6901,11 +6901,14 @@ void reset_lnums(void) { FOR_ALL_TAB_WINDOWS(tp, wp) { if (wp->w_buffer == curbuf) { - // Restore the value if the autocommand didn't change it. - if (equalpos(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 (equalpos(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; } } |