diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/doc/lua.txt | 15 | ||||
-rw-r--r-- | runtime/lua/vim/shared.lua | 32 |
2 files changed, 37 insertions, 10 deletions
diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt index 53d68fa5e6..208a94e377 100644 --- a/runtime/doc/lua.txt +++ b/runtime/doc/lua.txt @@ -1373,20 +1373,23 @@ pesc({s}) *vim.pesc()* See also: ~ https://github.com/rxi/lume -split({s}, {sep}, {plain}) *vim.split()* +split({s}, {sep}, {plain}, {trimempty}) *vim.split()* Splits a string at each instance of a separator. Examples: > split(":aa::b:", ":") --> {'','aa','','b',''} split("axaby", "ab?") --> {'','x','y'} - split(x*yz*o, "*", true) --> {'x','yz','o'} + split("x*yz*o", "*", true) --> {'x','yz','o'} + split("|x|y|z|", "|", true, true) --> {'x', 'y', 'z'} < Parameters: ~ - {s} String to split - {sep} Separator string or pattern - {plain} If `true` use `sep` literally (passed to - String.find) + {s} String to split + {sep} Separator string or pattern + {plain} If `true` use `sep` literally (passed to + String.find) + {trimempty} If `true` remove empty items from the front + and back of the list Return: ~ List-like table of the split components. diff --git a/runtime/lua/vim/shared.lua b/runtime/lua/vim/shared.lua index 18c1e21049..e18dec9a45 100644 --- a/runtime/lua/vim/shared.lua +++ b/runtime/lua/vim/shared.lua @@ -98,17 +98,41 @@ end --- <pre> --- split(":aa::b:", ":") --> {'','aa','','b',''} --- split("axaby", "ab?") --> {'','x','y'} ---- split(x*yz*o, "*", true) --> {'x','yz','o'} +--- split("x*yz*o", "*", true) --> {'x','yz','o'} +--- split("|x|y|z|", "|", true, true) --> {'x', 'y', 'z'} --- </pre> --- +--- ---@see |vim.gsplit()| --- ---@param s String to split ---@param sep Separator string or pattern ---@param plain If `true` use `sep` literally (passed to String.find) +---@param trimempty If `true` remove empty items from the front and back of the list ---@returns List-like table of the split components. -function vim.split(s,sep,plain) - local t={} for c in vim.gsplit(s, sep, plain) do table.insert(t,c) end +function vim.split(s, sep, plain, trimempty) + -- Only need to validate trimempty since the rest are validated by vim.gsplit + vim.validate{trimempty={trimempty, 'b', true}} + local t = {} + local skip = trimempty + for c in vim.gsplit(s, sep, plain) do + if c ~= "" then + skip = false + end + + if not skip then + table.insert(t, c) + end + end + + if trimempty then + for i = #t, 1, -1 do + if t[i] ~= "" then + break + end + table.remove(t, i) + end + end + return t end |