aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTJ DeVries <devries.timothyj@gmail.com>2021-06-11 12:28:15 -0400
committerTJ DeVries <devries.timothyj@gmail.com>2021-06-29 08:42:07 -0400
commit9119ea1becd5024ad14db04e2868feeae7c7d4de (patch)
tree9feda7543dabc43d7bec1ba01da46fec2d76de53
parentb02e64c4dffd9044ea83e3f2d74b5f6db6bf6b99 (diff)
downloadrneovim-9119ea1becd5024ad14db04e2868feeae7c7d4de.tar.gz
rneovim-9119ea1becd5024ad14db04e2868feeae7c7d4de.tar.bz2
rneovim-9119ea1becd5024ad14db04e2868feeae7c7d4de.zip
fix(vim.opt): Fix #14669 whichwrap now acts as expected
-rw-r--r--runtime/lua/vim/_meta.lua49
-rw-r--r--test/functional/lua/vim_spec.lua19
2 files changed, 55 insertions, 13 deletions
diff --git a/runtime/lua/vim/_meta.lua b/runtime/lua/vim/_meta.lua
index 92c8fe0e26..e030c9ac81 100644
--- a/runtime/lua/vim/_meta.lua
+++ b/runtime/lua/vim/_meta.lua
@@ -267,7 +267,7 @@ local key_value_options = {
winhl = true,
}
----@class OptionType
+---@class OptionTypes
--- Option Type Enum
local OptionTypes = setmetatable({
BOOLEAN = 0,
@@ -342,14 +342,29 @@ local convert_value_to_vim = (function()
[OptionTypes.NUMBER] = function(_, value) return value end,
[OptionTypes.STRING] = function(_, value) return value end,
- [OptionTypes.SET] = function(_, value)
+ [OptionTypes.SET] = function(info, value)
if type(value) == "string" then return value end
- local result = ''
- for k in pairs(value) do
- result = result .. k
- end
- return result
+ if info.flaglist and info.commalist then
+ local keys = {}
+ for k, v in pairs(value) do
+ if v then
+ table.insert(keys, k)
+ end
+ end
+
+ table.sort(keys)
+ return table.concat(keys, ",")
+ else
+ local result = ''
+ for k, v in pairs(value) do
+ if v then
+ result = result .. k
+ end
+ end
+
+ return result
+ end
end,
[OptionTypes.ARRAY] = function(info, value)
@@ -404,12 +419,22 @@ local convert_value_to_lua = (function()
assert(info.flaglist, "That is the only one I know how to handle")
- local result = {}
- for i = 1, #value do
- result[value:sub(i, i)] = true
- end
+ if info.flaglist and info.commalist then
+ local split_value = vim.split(value, ",")
+ local result = {}
+ for _, v in ipairs(split_value) do
+ result[v] = true
+ end
- return result
+ return result
+ else
+ local result = {}
+ for i = 1, #value do
+ result[value:sub(i, i)] = true
+ end
+
+ return result
+ end
end,
[OptionTypes.MAP] = function(info, raw_value)
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
index e3d19008cc..cb94004872 100644
--- a/test/functional/lua/vim_spec.lua
+++ b/test/functional/lua/vim_spec.lua
@@ -1314,6 +1314,22 @@ describe('lua stdlib', function()
eq("*.c", wildignore[1])
end)
+ it('should work for options that are both commalist and flaglist', function()
+ local result = exec_lua [[
+ vim.opt.whichwrap = "b,s"
+ return vim.opt.whichwrap:get()
+ ]]
+
+ eq({b = true, s = true}, result)
+
+ result = exec_lua [[
+ vim.opt.whichwrap = { b = true, s = false, h = true }
+ return vim.opt.whichwrap:get()
+ ]]
+
+ eq({b = true, h = true}, result)
+ end)
+
it('should work for key-value pair options', function()
local listchars = exec_lua [[
vim.opt.listchars = "tab:>~,space:_"
@@ -1695,7 +1711,8 @@ describe('lua stdlib', function()
}
return vim.go.whichwrap
]]
- eq(true, ww == "bs" or ww == "sb")
+
+ eq(ww, "b,s")
eq("b,s,<,>,[,]", exec_lua [[
vim.opt.whichwrap = "b,s,<,>,[,]"
return vim.go.whichwrap