fix(options): vim.opt fails for 'fillchars' #37141

Problem:
When `to_vim_value[info.metatype](info, value)` is called, a list value
such as `{'eob:a'}` is treated like a map, which generates `1:eob:a`.

Note: commands like `:lua vim.opt.wildmode={'longest:full'}` are not an
issue because only cases harcoded in `key_value_options` have metatype `map`.

Solution:
Check for array type and use the same logic as in array metatypes.
This commit is contained in:
Juan Pablo Briones
2026-03-18 20:19:47 -03:00
committed by GitHub
parent 8f9278d7c2
commit f4f1149292
2 changed files with 11 additions and 1 deletions

View File

@@ -435,6 +435,9 @@ local to_vim_value = {
map = function(_, value)
if type(value) == 'string' then
return value
elseif vim.isarray(value) then
value = remove_duplicate_values(value)
return table.concat(value, ',')
end
local result = {}

View File

@@ -778,7 +778,7 @@ describe('lua stdlib', function()
eq(true, not formatoptions.q)
end)
it('works for array list type options', function()
it('works for comma list type options', function()
local wildignore = exec_lua(function()
vim.opt.wildignore = '*.c,*.o,__pycache__'
return vim.opt.wildignore:get()
@@ -788,6 +788,13 @@ describe('lua stdlib', function()
eq('*.c', wildignore[1])
end)
it('works for array list type options', function()
eq_exec_lua({ eol = '~', space = '-' }, function()
vim.opt.listchars = { 'eol:~', 'space:-' }
return vim.opt.listchars:get()
end)
end)
it('works for options that are both commalist and flaglist', function()
eq_exec_lua({ b = true, s = true }, function()
vim.opt.whichwrap = 'b,s'