fix(lua): vim.split may trim inner empty items

Problem:
`vim.split('a:::', ':', {trimempty=true})` trims inner empty items.
Regression from 9c49c10470

Solution:
Set `empty_start=false` when first non-empty item is found.
close #23212
This commit is contained in:
Justin M. Keyes 2023-04-21 06:46:18 +02:00
parent 9e79f7433e
commit 622b1ae38a
2 changed files with 6 additions and 2 deletions

View File

@ -138,7 +138,9 @@ function vim.gsplit(s, sep, opts)
local seg = _pass(s:find(sep, start, plain)) local seg = _pass(s:find(sep, start, plain))
-- Trim empty segments from start/end. -- Trim empty segments from start/end.
if trimempty and seg == '' then if seg ~= '' then
empty_start = false
elseif trimempty then
while not done and seg == '' do while not done and seg == '' do
empty_segs = empty_segs + 1 empty_segs = empty_segs + 1
seg = _pass(s:find(sep, start, plain)) seg = _pass(s:find(sep, start, plain))

View File

@ -294,9 +294,11 @@ describe('lua stdlib', function()
it('vim.gsplit, vim.split', function() it('vim.gsplit, vim.split', function()
local tests = { local tests = {
-- plain trimempty
{ 'a,b', ',', false, false, { 'a', 'b' } }, { 'a,b', ',', false, false, { 'a', 'b' } },
{ ':aa::::bb:', ':', false, false, { '', 'aa', '', '', '', 'bb', '' } }, { ':aa::::bb:', ':', false, false, { '', 'aa', '', '', '', 'bb', '' } },
{ ':aa::::bb:', ':', false, true, { 'aa', '', '', '', 'bb' } }, { ':aa::::bb:', ':', false, true, { 'aa', '', '', '', 'bb' } },
{ 'aa::::bb:', ':', false, true, { 'aa', '', '', '', 'bb' } },
{ ':aa::bb:', ':', false, true, { 'aa', '', 'bb' } }, { ':aa::bb:', ':', false, true, { 'aa', '', 'bb' } },
{ '/a/b:/b/\n', '[:\n]', false, true, { '/a/b', '/b/' } }, { '/a/b:/b/\n', '[:\n]', false, true, { '/a/b', '/b/' } },
{ '::ee::ff:', ':', false, false, { '', '', 'ee', '', 'ff', '' } }, { '::ee::ff:', ':', false, false, { '', '', 'ee', '', 'ff', '' } },
@ -315,7 +317,7 @@ describe('lua stdlib', function()
} }
for _, t in ipairs(tests) do for _, t in ipairs(tests) do
eq(t[5], vim.split(t[1], t[2], {plain=t[3], trimempty=t[4]})) eq(t[5], vim.split(t[1], t[2], {plain=t[3], trimempty=t[4]}), t[1])
end end
-- Test old signature -- Test old signature