aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/shared.lua
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2023-04-21 07:26:44 +0200
committerJustin M. Keyes <justinkz@gmail.com>2023-04-21 13:50:22 +0200
commit824766612d4e7d53b717bd1e2b0d1d895054accd (patch)
treeb056ee5f2a46fb376d19166504331c83356ba6a4 /runtime/lua/vim/shared.lua
parent622b1ae38a36c3d26fad19faa788d622f7835921 (diff)
downloadrneovim-824766612d4e7d53b717bd1e2b0d1d895054accd.tar.gz
rneovim-824766612d4e7d53b717bd1e2b0d1d895054accd.tar.bz2
rneovim-824766612d4e7d53b717bd1e2b0d1d895054accd.zip
refactor(lua): simplify vim.gsplit impl
Diffstat (limited to 'runtime/lua/vim/shared.lua')
-rw-r--r--runtime/lua/vim/shared.lua31
1 files changed, 13 insertions, 18 deletions
diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua
index 08f8afd087..5f4ea8822b 100644
--- a/runtime/lua/vim/shared.lua
+++ b/runtime/lua/vim/shared.lua
@@ -100,10 +100,9 @@ function vim.gsplit(s, sep, opts)
local start = 1
local done = false
- -- For `trimempty`:
+ -- For `trimempty`: queue of collected segments, to be emitted at next pass.
+ local segs = {}
local empty_start = true -- Only empty segments seen so far.
- local empty_segs = 0 -- Empty segments found between non-empty segments.
- local nonemptyseg = nil
local function _pass(i, j, ...)
if i then
@@ -118,14 +117,9 @@ function vim.gsplit(s, sep, opts)
end
return function()
- if trimempty and empty_segs > 0 then
- -- trimempty: Pop the collected empty segments.
- empty_segs = empty_segs - 1
- return ''
- elseif trimempty and nonemptyseg then
- local seg = nonemptyseg
- nonemptyseg = nil
- return seg
+ if trimempty and #segs > 0 then
+ -- trimempty: Pop the collected segments.
+ return table.remove(segs)
elseif done or (s == '' and sep == '') then
return nil
elseif sep == '' then
@@ -138,23 +132,24 @@ function vim.gsplit(s, sep, opts)
local seg = _pass(s:find(sep, start, plain))
-- Trim empty segments from start/end.
- if seg ~= '' then
+ if trimempty and seg ~= '' then
empty_start = false
- elseif trimempty then
+ elseif trimempty and seg == '' then
while not done and seg == '' do
- empty_segs = empty_segs + 1
+ table.insert(segs, 1, '')
seg = _pass(s:find(sep, start, plain))
end
if done and seg == '' then
return nil
elseif empty_start then
empty_start = false
- empty_segs = 0
+ segs = {}
return seg
end
- nonemptyseg = seg ~= '' and seg or nil
- seg = ''
- empty_segs = empty_segs - 1
+ if seg ~= '' then
+ table.insert(segs, 1, seg)
+ end
+ return table.remove(segs)
end
return seg