feat(api): nvim_win_set_config accepts unchanged "noautocmd" #36463

Problem: Cannot reuse same config with noautocmd for both window
creation and updates, even when value is unchanged.

Solution: Only reject noautocmd changes for existing windows.
This commit is contained in:
glepnir
2025-11-19 12:23:50 +08:00
committed by GitHub
parent c567340171
commit 4998b8d7b5
4 changed files with 21 additions and 5 deletions

View File

@@ -3892,7 +3892,9 @@ nvim_open_win({buffer}, {enter}, {config}) *nvim_open_win()*
option. Value can be one of "left", "center", or "right". option. Value can be one of "left", "center", or "right".
Default is `"left"`. Default is `"left"`.
• noautocmd: If true then all autocommands are blocked for • noautocmd: If true then all autocommands are blocked for
the duration of the call. the duration of the call. Once set at window creation,
this option cannot be modified later through
|nvim_win_set_config()|.
• fixed: If true when anchor is NW or SW, the float window • fixed: If true when anchor is NW or SW, the float window
would be kept fixed even if the window would be truncated. would be kept fixed even if the window would be truncated.
• hide: If true the floating window will be hidden and the • hide: If true the floating window will be hidden and the

View File

@@ -1862,7 +1862,8 @@ function vim.api.nvim_open_term(buffer, opts) end
--- Value can be one of "left", "center", or "right". --- Value can be one of "left", "center", or "right".
--- Default is `"left"`. --- Default is `"left"`.
--- - noautocmd: If true then all autocommands are blocked for the duration of --- - noautocmd: If true then all autocommands are blocked for the duration of
--- the call. --- the call. Once set at window creation, this option cannot be modified
--- later through `nvim_win_set_config()`.
--- - fixed: If true when anchor is NW or SW, the float window --- - fixed: If true when anchor is NW or SW, the float window
--- would be kept fixed even if the window would be truncated. --- would be kept fixed even if the window would be truncated.
--- - hide: If true the floating window will be hidden and the cursor will be invisible when --- - hide: If true the floating window will be hidden and the cursor will be invisible when

View File

@@ -195,7 +195,8 @@
/// Value can be one of "left", "center", or "right". /// Value can be one of "left", "center", or "right".
/// Default is `"left"`. /// Default is `"left"`.
/// - noautocmd: If true then all autocommands are blocked for the duration of /// - noautocmd: If true then all autocommands are blocked for the duration of
/// the call. /// the call. Once set at window creation, this option cannot be modified
/// later through |nvim_win_set_config()|.
/// - fixed: If true when anchor is NW or SW, the float window /// - fixed: If true when anchor is NW or SW, the float window
/// would be kept fixed even if the window would be truncated. /// would be kept fixed even if the window would be truncated.
/// - hide: If true the floating window will be hidden and the cursor will be invisible when /// - hide: If true the floating window will be hidden and the cursor will be invisible when
@@ -1380,8 +1381,9 @@ static bool parse_win_config(win_T *wp, Dict(win_config) *config, WinConfig *fco
} }
if (HAS_KEY_X(config, noautocmd)) { if (HAS_KEY_X(config, noautocmd)) {
if (wp) { if (wp && config->noautocmd != fconfig->noautocmd) {
api_set_error(err, kErrorTypeValidation, "'noautocmd' cannot be used with existing windows"); api_set_error(err, kErrorTypeValidation,
"'noautocmd' cannot be changed with existing windows");
goto fail; goto fail;
} }
fconfig->noautocmd = config->noautocmd; fconfig->noautocmd = config->noautocmd;

View File

@@ -3118,6 +3118,17 @@ describe('API/win', function()
eq(t2_alt_win, api.nvim_tabpage_get_win(t2)) eq(t2_alt_win, api.nvim_tabpage_get_win(t2))
eq(t1, api.nvim_win_get_tabpage(t2_cur_win)) eq(t1, api.nvim_win_get_tabpage(t2_cur_win))
end) end)
it('set_config cannot change "noautocmd" #36409', function()
local cfg = { relative = 'editor', row = 1, col = 1, height = 2, width = 2, noautocmd = true }
local win = api.nvim_open_win(0, false, cfg)
cfg.height = 10
eq(true, pcall(api.nvim_win_set_config, win, cfg))
cfg.noautocmd = false
eq(
"'noautocmd' cannot be changed with existing windows",
pcall_err(api.nvim_win_set_config, win, cfg)
)
end)
end) end)
describe('get_config', function() describe('get_config', function()