mirror of
https://github.com/neovim/neovim.git
synced 2025-09-27 21:48:35 +00:00
fix(api): nvim_set_option_value for global-local options
global-local window options need to be handled specially. When `win` is given but `scope` is not, then we want to set the local version of the option but not the global one, therefore we need to force `scope='local'`. Note this does not apply to window-local only options (e.g. 'number') Example: nvim_set_option_value('scrolloff', 10, {}) -- global-local window option; set global value nvim_set_option_value('scrolloff', 20, {win=0}) -- global-local window option; set local value nvim_set_option_value('number', true, {}) -- local window option is now equivalent to: nvim_set_option_value('scrolloff', 10, {}) nvim_set_option_value('scrolloff', 20, {win=0, scope='local'}) -- changed from before nvim_set_option_value('number', true, {win=0}) -- unchanged from before Only the global-local option with a `win` provided gets forced to local scope.
This commit is contained in:
@@ -156,6 +156,19 @@ void nvim_set_option_value(String name, Object value, Dict(option) *opts, Error
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If:
|
||||||
|
// - window id is provided
|
||||||
|
// - scope is not provided
|
||||||
|
// - option is global or local to window (global-local)
|
||||||
|
//
|
||||||
|
// Then force scope to local since we don't want to change the global option
|
||||||
|
if (opt_type == SREQ_WIN && scope == 0) {
|
||||||
|
int flags = get_option_value_strict(name.data, NULL, NULL, opt_type, to);
|
||||||
|
if (flags & SOPT_GLOBAL) {
|
||||||
|
scope = OPT_LOCAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
long numval = 0;
|
long numval = 0;
|
||||||
char *stringval = NULL;
|
char *stringval = NULL;
|
||||||
|
|
||||||
@@ -454,11 +467,12 @@ void set_option_to(uint64_t channel_id, void *to, int type, String name, Object
|
|||||||
stringval = value.data.string.data;
|
stringval = value.data.string.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
WITH_SCRIPT_CONTEXT(channel_id, {
|
// For global-win-local options -> setlocal
|
||||||
const int opt_flags = (type == SREQ_WIN && !(flags & SOPT_GLOBAL))
|
// For win-local options -> setglobal and setlocal (opt_flags == 0)
|
||||||
? 0 : (type == SREQ_GLOBAL)
|
const int opt_flags = (type == SREQ_WIN && !(flags & SOPT_GLOBAL)) ? 0 :
|
||||||
? OPT_GLOBAL : OPT_LOCAL;
|
(type == SREQ_GLOBAL) ? OPT_GLOBAL : OPT_LOCAL;
|
||||||
|
|
||||||
|
WITH_SCRIPT_CONTEXT(channel_id, {
|
||||||
access_option_value_for(name.data, &numval, &stringval, opt_flags, type, to, false, err);
|
access_option_value_for(name.data, &numval, &stringval, opt_flags, type, to, false, err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -1424,6 +1424,13 @@ describe('lua stdlib', function()
|
|||||||
vim.wo[1000].cole = 0
|
vim.wo[1000].cole = 0
|
||||||
]]
|
]]
|
||||||
eq(0, funcs.luaeval "vim.wo[1000].cole")
|
eq(0, funcs.luaeval "vim.wo[1000].cole")
|
||||||
|
|
||||||
|
-- Can handle global-local values
|
||||||
|
exec_lua [[vim.o.scrolloff = 100]]
|
||||||
|
exec_lua [[vim.wo.scrolloff = 200]]
|
||||||
|
eq(200, funcs.luaeval "vim.wo.scrolloff")
|
||||||
|
exec_lua [[vim.wo.scrolloff = -1]]
|
||||||
|
eq(100, funcs.luaeval "vim.wo.scrolloff")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('vim.opt', function()
|
describe('vim.opt', function()
|
||||||
|
Reference in New Issue
Block a user