mirror of
https://github.com/neovim/neovim.git
synced 2025-12-16 03:15:39 +00:00
fix(api): win_set_config fires unnecessary autocmds
Problem: win_set_config should have the observable effect of moving an existing window to another place, but instead fires autocommands as if a new window was created and entered (and does not fire autocommands reflecting a "return" to the original window). Solution: do not fire win_enter-related autocommands when splitting the window, but continue to fire them when entering the window that fills the new space when moving a window to a different tabpage, as the new curwin changes. Also, remove "++once" from the WinEnter autocmd in the other test, as omitting it also crashed Nvim before this fix.
This commit is contained in:
@@ -1668,7 +1668,7 @@ describe('API/win', function()
|
||||
command('split | tabnew')
|
||||
local w = api.nvim_get_current_win()
|
||||
local t = api.nvim_get_current_tabpage()
|
||||
command('tabfirst | autocmd WinEnter * ++once quit')
|
||||
command('tabfirst | autocmd WinEnter * quit')
|
||||
api.nvim_win_set_config(0, { win = w, split = 'left' })
|
||||
-- New tabpage is now the only one, as WinEnter closed the new curwin in the original.
|
||||
eq(t, api.nvim_get_current_tabpage())
|
||||
@@ -1684,6 +1684,38 @@ describe('API/win', function()
|
||||
pcall_err(api.nvim_win_set_config, 0, { win = w, split = 'left' })
|
||||
)
|
||||
end)
|
||||
|
||||
it('expected autocmds when moving window to other tabpage', function()
|
||||
local new_curwin = api.nvim_get_current_win()
|
||||
command('split')
|
||||
local win = api.nvim_get_current_win()
|
||||
command('tabnew')
|
||||
local parent = api.nvim_get_current_win()
|
||||
exec([[
|
||||
tabfirst
|
||||
let result = []
|
||||
autocmd WinEnter * let result += ["Enter", win_getid()]
|
||||
autocmd WinLeave * let result += ["Leave", win_getid()]
|
||||
autocmd WinNew * let result += ["New", win_getid()]
|
||||
]])
|
||||
api.nvim_win_set_config(0, { win = parent, split = 'left' })
|
||||
-- Shouldn't see WinNew, as we're not creating any new windows, just moving existing ones.
|
||||
eq({ 'Leave', win, 'Enter', new_curwin }, eval('result'))
|
||||
end)
|
||||
|
||||
it('no autocmds when moving window within same tabpage', function()
|
||||
local parent = api.nvim_get_current_win()
|
||||
exec([[
|
||||
split
|
||||
let result = []
|
||||
autocmd WinEnter * let result += ["Enter", win_getid()]
|
||||
autocmd WinLeave * let result += ["Leave", win_getid()]
|
||||
autocmd WinNew * let result += ["New", win_getid()]
|
||||
]])
|
||||
api.nvim_win_set_config(0, { win = parent, split = 'left' })
|
||||
-- Shouldn't see any of those events, as we remain in the same window.
|
||||
eq({}, eval('result'))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('get_config', function()
|
||||
|
||||
Reference in New Issue
Block a user