From 5717ee33db0048a496e8bed0b0cb20133b3f76ca Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sun, 25 May 2025 16:59:50 +0200 Subject: [PATCH] patch 9.1.1407: Can't use getpos('v') in OptionSet when using setbufvar() Problem: Can't use getpos('v') in OptionSet when using setbufvar(). Solution: Don't reset Visual selection when switching to the same buffer (zeertzjq). closes: #17373 Signed-off-by: zeertzjq Signed-off-by: Christian Brabandt --- src/autocmd.c | 8 +++++--- src/testdir/test_autocmd.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/autocmd.c b/src/autocmd.c index 3d21a937bc..6a5f035d2e 100644 --- a/src/autocmd.c +++ b/src/autocmd.c @@ -1585,9 +1585,10 @@ aucmd_prepbuf( #ifdef FEAT_AUTOCHDIR int save_acd; #endif + int same_buffer = buf == curbuf; // Find a window that is for the new buffer - if (buf == curbuf) // be quick when buf is curbuf + if (same_buffer) // be quick when buf is curbuf win = curwin; else FOR_ALL_WINDOWS(win) @@ -1677,9 +1678,10 @@ aucmd_prepbuf( aco->new_curwin_id = curwin->w_id; set_bufref(&aco->new_curbuf, curbuf); - // disable the Visual area, the position may be invalid in another buffer aco->save_VIsual_active = VIsual_active; - VIsual_active = FALSE; + if (!same_buffer) + // disable the Visual area, position may be invalid in another buffer + VIsual_active = FALSE; } /* diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 1988807f75..dfeb93f06d 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -3761,6 +3761,27 @@ func Test_Visual_doautoall_redraw() %bwipe! endfunc +func Test_get_Visual_selection_in_curbuf_autocmd() + call test_override('starting', 1) + new + autocmd OptionSet list let b:text = getregion(getpos('.'), getpos('v')) + call setline(1, 'foo bar baz') + + normal! gg0fbvtb + setlocal list + call assert_equal(['bar '], b:text) + exe "normal! \" + + normal! v0 + call setbufvar('%', '&list', v:false) + call assert_equal(['foo bar '], b:text) + exe "normal! \" + + autocmd! OptionSet list + bwipe! + call test_override('starting', 0) +endfunc + " This was using freed memory. func Test_BufNew_arglocal() arglocal diff --git a/src/version.c b/src/version.c index b9af08a7de..637f178a03 100644 --- a/src/version.c +++ b/src/version.c @@ -709,6 +709,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1407, /**/ 1406, /**/