vim-patch:9.1.1407: Can't use getpos('v') in OptionSet when using setbufvar() (#34177)

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: vim/vim#17373

5717ee33db
(cherry picked from commit bd01bd6564)
This commit is contained in:
zeertzjq
2025-05-26 06:51:15 +08:00
committed by github-actions[bot]
parent 5e0ef6afc7
commit d1ca551983
4 changed files with 63 additions and 3 deletions

View File

@ -1268,9 +1268,10 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf)
{
win_T *win;
bool need_append = true; // Append `aucmd_win` to the window list.
const bool 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 {
win = NULL;
@ -1360,9 +1361,11 @@ void aucmd_prepbuf(aco_save_T *aco, buf_T *buf)
aco->new_curwin_handle = curwin->handle;
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;
}
}
/// Cleanup after executing autocommands for a (hidden) buffer.

View File

@ -11,6 +11,30 @@ local eq = t.eq
before_each(clear)
local function expected_empty()
eq({}, api.nvim_get_vvar('errors'))
end
-- oldtest: Test_get_Visual_selection_in_curbuf_autocmd()
it('autocmd can get Visual selection when using setbufvar() on curbuf', function()
n.exec([[
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! \<Esc>"
normal! v0
call setbufvar('%', '&list', v:false)
call assert_equal(['foo bar '], b:text)
exe "normal! \<Esc>"
]])
expected_empty()
end)
-- oldtest: Test_autocmd_invalidates_undo_on_textchanged()
it('no E440 in quickfix window when autocommand invalidates undo', function()
write_file(

View File

@ -3930,6 +3930,17 @@ stack traceback:
]]
)
end)
it('can get Visual selection in current buffer #34162', function()
insert('foo bar baz')
feed('gg0fbvtb')
local text = exec_lua([[
return vim.api.nvim_buf_call(0, function()
return vim.fn.getregion(vim.fn.getpos('.'), vim.fn.getpos('v'))
end)
]])
eq({ 'bar ' }, text)
end)
end)
describe('vim.api.nvim_win_call', function()

View File

@ -3458,6 +3458,28 @@ func Test_Visual_doautoall_redraw()
%bwipe!
endfunc
func Test_get_Visual_selection_in_curbuf_autocmd()
throw 'Skipped: use test/functional/legacy/autocmd_spec.lua'
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! \<Esc>"
normal! v0
call setbufvar('%', '&list', v:false)
call assert_equal(['foo bar '], b:text)
exe "normal! \<Esc>"
autocmd! OptionSet list
bwipe!
call test_override('starting', 0)
endfunc
" This was using freed memory.
func Test_BufNew_arglocal()
arglocal