aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2019-01-14 02:13:39 +0100
committerGitHub <noreply@github.com>2019-01-14 02:13:39 +0100
commit989fbad5028a2f7d31fef944aac166d562665477 (patch)
tree060127c234e339cc4bd7b78e6b5dedcc64ddafd4
parent0d66cdc6f9c1ac25ab13223c807a4a75d3ee23a2 (diff)
parent38b925643949c9422906f264d004168d9b745b74 (diff)
downloadrneovim-989fbad5028a2f7d31fef944aac166d562665477.tar.gz
rneovim-989fbad5028a2f7d31fef944aac166d562665477.tar.bz2
rneovim-989fbad5028a2f7d31fef944aac166d562665477.zip
Merge #9395 from pqzx/api-set-vvar
-rw-r--r--src/nvim/api/private/helpers.c31
-rw-r--r--src/nvim/api/vim.c11
-rw-r--r--test/functional/api/vim_spec.lua15
3 files changed, 36 insertions, 21 deletions
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index cd6060b5d2..82c9a1da67 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -184,35 +184,28 @@ Object dict_set_var(dict_T *dict, String key, Object value, bool del,
bool retval, Error *err)
{
Object rv = OBJECT_INIT;
-
- if (dict->dv_lock) {
- api_set_error(err, kErrorTypeException, "Dictionary is locked");
- return rv;
- }
-
- if (key.size == 0) {
- api_set_error(err, kErrorTypeValidation, "Key name is empty");
- return rv;
- }
-
- if (key.size > INT_MAX) {
- api_set_error(err, kErrorTypeValidation, "Key name is too long");
- return rv;
- }
-
dictitem_T *di = tv_dict_find(dict, key.data, (ptrdiff_t)key.size);
if (di != NULL) {
if (di->di_flags & DI_FLAGS_RO) {
api_set_error(err, kErrorTypeException, "Key is read-only: %s", key.data);
return rv;
- } else if (di->di_flags & DI_FLAGS_FIX) {
- api_set_error(err, kErrorTypeException, "Key is fixed: %s", key.data);
- return rv;
} else if (di->di_flags & DI_FLAGS_LOCK) {
api_set_error(err, kErrorTypeException, "Key is locked: %s", key.data);
return rv;
+ } else if (del && (di->di_flags & DI_FLAGS_FIX)) {
+ api_set_error(err, kErrorTypeException, "Key is fixed: %s", key.data);
+ return rv;
}
+ } else if (dict->dv_lock) {
+ api_set_error(err, kErrorTypeException, "Dictionary is locked");
+ return rv;
+ } else if (key.size == 0) {
+ api_set_error(err, kErrorTypeValidation, "Key name is empty");
+ return rv;
+ } else if (key.size > INT_MAX) {
+ api_set_error(err, kErrorTypeValidation, "Key name is too long");
+ return rv;
}
if (del) {
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 24e76ecf88..ce7ef681ef 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -687,6 +687,17 @@ Object nvim_get_vvar(String name, Error *err)
return dict_get_value(&vimvardict, name, err);
}
+/// Sets a v: variable, if it is not readonly
+///
+/// @param name Variable name
+/// @param value Variable value
+/// @param[out] err Error details, if any
+void nvim_set_vvar(String name, Object value, Error *err)
+ FUNC_API_SINCE(6)
+{
+ dict_set_var(&vimvardict, name, value, false, false, err);
+}
+
/// Gets an option value string
///
/// @param name Option name
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index 52e41ca856..0e06e48a35 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -351,8 +351,8 @@ describe('API', function()
end)
end)
- describe('nvim_get_var, nvim_set_var, nvim_del_var', function()
- it('works', function()
+ describe('set/get/del variables', function()
+ it('nvim_get_var, nvim_set_var, nvim_del_var', function()
nvim('set_var', 'lua', {1, 2, {['3'] = 1}})
eq({1, 2, {['3'] = 1}}, nvim('get_var', 'lua'))
eq({1, 2, {['3'] = 1}}, nvim('eval', 'g:lua'))
@@ -361,11 +361,22 @@ describe('API', function()
eq(0, funcs.exists('g:lua'))
eq({false, "Key not found: lua"}, meth_pcall(meths.del_var, 'lua'))
meths.set_var('lua', 1)
+
+ -- Set locked g: var.
command('lockvar lua')
eq({false, 'Key is locked: lua'}, meth_pcall(meths.del_var, 'lua'))
eq({false, 'Key is locked: lua'}, meth_pcall(meths.set_var, 'lua', 1))
end)
+ it('nvim_get_vvar, nvim_set_vvar', function()
+ -- Set readonly v: var.
+ expect_err('Key is read%-only: count$', request,
+ 'nvim_set_vvar', 'count', 42)
+ -- Set writable v: var.
+ meths.set_vvar('errmsg', 'set by API')
+ eq('set by API', meths.get_vvar('errmsg'))
+ end)
+
it('vim_set_var returns the old value', function()
local val1 = {1, 2, {['3'] = 1}}
local val2 = {4, 7}