diff options
-rw-r--r-- | runtime/lua/vim/_meta.lua | 38 | ||||
-rw-r--r-- | test/functional/api/vim_spec.lua | 3 | ||||
-rw-r--r-- | test/functional/lua/vim_spec.lua | 20 |
3 files changed, 59 insertions, 2 deletions
diff --git a/runtime/lua/vim/_meta.lua b/runtime/lua/vim/_meta.lua index e030c9ac81..416746b2cc 100644 --- a/runtime/lua/vim/_meta.lua +++ b/runtime/lua/vim/_meta.lua @@ -405,12 +405,46 @@ local convert_value_to_lua = (function() [OptionTypes.NUMBER] = function(_, value) return value end, [OptionTypes.STRING] = function(_, value) return value end, - [OptionTypes.ARRAY] = function(_, value) + [OptionTypes.ARRAY] = function(info, value) if type(value) == "table" then - value = remove_duplicate_values(value) + if not info.allows_duplicates then + value = remove_duplicate_values(value) + end + return value end + -- Handles unescaped commas in a list. + if string.find(value, ",,,") then + local comma_split = vim.split(value, ",,,") + local left = comma_split[1] + local right = comma_split[2] + + local result = {} + vim.list_extend(result, vim.split(left, ",")) + table.insert(result, ",") + vim.list_extend(result, vim.split(right, ",")) + + table.sort(result) + + return result + end + + if string.find(value, ",^,,", 1, true) then + local comma_split = vim.split(value, ",^,,", true) + local left = comma_split[1] + local right = comma_split[2] + + local result = {} + vim.list_extend(result, vim.split(left, ",")) + table.insert(result, "^,") + vim.list_extend(result, vim.split(right, ",")) + + table.sort(result) + + return result + end + return vim.split(value, ",") end, diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 0c0f610401..91d2745130 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -2003,6 +2003,7 @@ describe('API', function() it('should have information about window options', function() eq({ + allows_duplicates = true, commalist = false; default = ""; flaglist = false; @@ -2020,6 +2021,7 @@ describe('API', function() it('should have information about buffer options', function() eq({ + allows_duplicates = true, commalist = false, default = "", flaglist = false, @@ -2041,6 +2043,7 @@ describe('API', function() eq(false, meths.get_option'showcmd') eq({ + allows_duplicates = true, commalist = false, default = true, flaglist = false, diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index cb94004872..ad0bb50c6e 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -1731,6 +1731,26 @@ describe('lua stdlib', function() ]])) end) end) + + -- isfname=a,b,c,,,d,e,f + it('can handle isfname ,,,', function() + local result = exec_lua [[ + vim.opt.isfname = "a,b,,,c" + return { vim.opt.isfname:get(), vim.api.nvim_get_option('isfname') } + ]] + + eq({{",", "a", "b", "c"}, "a,b,,,c"}, result) + end) + + -- isfname=a,b,c,^,,def + it('can handle isfname ,^,,', function() + local result = exec_lua [[ + vim.opt.isfname = "a,b,^,,c" + return { vim.opt.isfname:get(), vim.api.nvim_get_option('isfname') } + ]] + + eq({{"^,", "a", "b", "c"}, "a,b,^,,c"}, result) + end) end) -- vim.opt it('vim.cmd', function() |