diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-01-14 02:13:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-14 02:13:39 +0100 |
commit | 989fbad5028a2f7d31fef944aac166d562665477 (patch) | |
tree | 060127c234e339cc4bd7b78e6b5dedcc64ddafd4 | |
parent | 0d66cdc6f9c1ac25ab13223c807a4a75d3ee23a2 (diff) | |
parent | 38b925643949c9422906f264d004168d9b745b74 (diff) | |
download | rneovim-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.c | 31 | ||||
-rw-r--r-- | src/nvim/api/vim.c | 11 | ||||
-rw-r--r-- | test/functional/api/vim_spec.lua | 15 |
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} |