fix(api): make win_set_config with "win" for splits need "split/vertical"

Problem: currently, for splits, nvim_win_set_config accepts win without any of
split or vertical set, which has little effect and seems error-prone.

Solution: require at least one of split or vertical to also be set for splits.

Also, update nvim_win_set_config docs, as it's no longer limited to just
floating and external windows.
This commit is contained in:
Sean Dewar 2024-02-07 21:44:42 +00:00 committed by Sean Dewar
parent 5d58136ccc
commit b1577d371a
No known key found for this signature in database
GPG Key ID: 08CC2C83AD41B581
4 changed files with 27 additions and 14 deletions

View File

@ -3291,11 +3291,11 @@ nvim_win_get_config({window}) *nvim_win_get_config()*
Map defining the window configuration, see |nvim_open_win()|
nvim_win_set_config({window}, {config}) *nvim_win_set_config()*
Configures window layout. Currently only for floating and external windows
(including changing a split window to those layouts).
Configures window layout. Cannot be used to move the last window in a
tabpage to a different one.
When reconfiguring a floating window, absent option keys will not be
changed. `row`/`col` and `relative` must be reconfigured together.
When reconfiguring a window, absent option keys will not be changed.
`row`/`col` and `relative` must be reconfigured together.
Parameters: ~
• {window} Window handle, or 0 for current window

View File

@ -2207,11 +2207,11 @@ function vim.api.nvim_win_remove_ns(window, ns_id) end
--- @param buffer integer Buffer handle
function vim.api.nvim_win_set_buf(window, buffer) end
--- Configures window layout. Currently only for floating and external windows
--- (including changing a split window to those layouts).
--- Configures window layout. Cannot be used to move the last window in a
--- tabpage to a different one.
---
--- When reconfiguring a floating window, absent option keys will not be
--- changed. `row`/`col` and `relative` must be reconfigured together.
--- When reconfiguring a window, absent option keys will not be changed.
--- `row`/`col` and `relative` must be reconfigured together.
---
--- @param window integer Window handle, or 0 for current window
--- @param config vim.api.keyset.win_config Map defining the window configuration, see `nvim_open_win()`

View File

@ -361,11 +361,11 @@ static int win_split_flags(WinSplit split, bool toplevel)
return flags;
}
/// Configures window layout. Currently only for floating and external windows
/// (including changing a split window to those layouts).
/// Configures window layout. Cannot be used to move the last window in a
/// tabpage to a different one.
///
/// When reconfiguring a floating window, absent option keys will not be
/// changed. `row`/`col` and `relative` must be reconfigured together.
/// When reconfiguring a window, absent option keys will not be changed.
/// `row`/`col` and `relative` must be reconfigured together.
///
/// @see |nvim_open_win()|
///
@ -1099,11 +1099,15 @@ static bool parse_float_config(Dict(win_config) *config, WinConfig *fconfig, boo
fconfig->window = config->win;
}
}
} else if (has_relative) {
if (HAS_KEY_X(config, win)) {
} else if (HAS_KEY_X(config, win)) {
if (has_relative) {
api_set_error(err, kErrorTypeValidation,
"'win' key is only valid with relative='win' and relative=''");
return false;
} else if (!is_split) {
api_set_error(err, kErrorTypeValidation,
"non-float with 'win' requires at least 'split' or 'vertical'");
return false;
}
}

View File

@ -1727,6 +1727,15 @@ describe('API/win', function()
config = api.nvim_win_get_config(win)
eq('', config.relative)
eq('below', config.split)
eq(
"non-float with 'win' requires at least 'split' or 'vertical'",
pcall_err(api.nvim_win_set_config, 0, { win = 0 })
)
eq(
"non-float with 'win' requires at least 'split' or 'vertical'",
pcall_err(api.nvim_win_set_config, 0, { win = 0, relative = '' })
)
end)
it('creates top-level splits', function()