diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-02-04 19:35:31 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-04 19:35:31 +0800 |
commit | 90333b24c3582cb017d823583d4896c8bbb8edb8 (patch) | |
tree | 5ef8c616359c5300fe4242d9fe5c1bf226bf7a20 | |
parent | 964ae205a583807127eda75d9876fb6dfda6065c (diff) | |
download | rneovim-90333b24c3582cb017d823583d4896c8bbb8edb8.tar.gz rneovim-90333b24c3582cb017d823583d4896c8bbb8edb8.tar.bz2 rneovim-90333b24c3582cb017d823583d4896c8bbb8edb8.zip |
vim-patch:9.0.1277: cursor may move with autocmd in Visual mode (#22116)
Problem: Cursor may move with autocmd in Visual mode.
Solution: Restore "VIsual_active" before calling check_cursor().
(closes vim/vim#11939)
https://github.com/vim/vim/commit/49f0524fb575bb1cf4881e472afab7d37c579440
-rw-r--r-- | src/nvim/autocmd.c | 5 | ||||
-rw-r--r-- | src/nvim/testdir/test_functions.vim | 11 |
2 files changed, 14 insertions, 2 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 01ebdfdafe..897c9533e5 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -1535,6 +1535,7 @@ win_found: globaldir = aco->globaldir; // the buffer contents may have changed + VIsual_active = aco->save_VIsual_active; check_cursor(); if (curwin->w_topline > curbuf->b_ml.ml_line_count) { curwin->w_topline = curbuf->b_ml.ml_line_count; @@ -1563,14 +1564,16 @@ win_found: curwin = save_curwin; curbuf = curwin->w_buffer; prevwin = win_find_by_handle(aco->save_prevwin_handle); + // In case the autocommand moves the cursor to a position that does not // exist in curbuf + VIsual_active = aco->save_VIsual_active; check_cursor(); } } - check_cursor(); // just in case lines got deleted VIsual_active = aco->save_VIsual_active; + check_cursor(); // just in case lines got deleted if (VIsual_active) { check_pos(curbuf, &VIsual); } diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index 500c30c76b..4ed1187a19 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -1511,7 +1511,7 @@ endfunc func Test_setbufvar_options() " This tests that aucmd_prepbuf() and aucmd_restbuf() properly restore the - " window layout. + " window layout and cursor position. call assert_equal(1, winnr('$')) split dummy_preview resize 2 @@ -1525,11 +1525,20 @@ func Test_setbufvar_options() execute 'belowright vertical split #' . dummy_buf call assert_equal(wh, winheight(0)) let dum1_id = win_getid() + call setline(1, 'foo') + normal! V$ + call assert_equal(4, col('.')) + call setbufvar('dummy_preview', '&buftype', 'nofile') + call assert_equal(4, col('.')) wincmd h let wh = winheight(0) + call setline(1, 'foo') + normal! V$ + call assert_equal(4, col('.')) let dummy_buf = bufnr('dummy_buf2', v:true) eval 'nofile'->setbufvar(dummy_buf, '&buftype') + call assert_equal(4, col('.')) execute 'belowright vertical split #' . dummy_buf call assert_equal(wh, winheight(0)) |