aboutsummaryrefslogtreecommitdiff
path: root/test/testutil.lua
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2025-02-21 02:02:32 +0100
committerJustin M. Keyes <justinkz@gmail.com>2025-02-26 23:06:22 +0100
commitbe1fbe38b31b6046d396407c4efbf238941c6b08 (patch)
tree697a429f5ac903d766c2faaf5044fa7a16eeea77 /test/testutil.lua
parentf4921e2b7deb4812414998a521c33f920f571c20 (diff)
downloadrneovim-be1fbe38b31b6046d396407c4efbf238941c6b08.tar.gz
rneovim-be1fbe38b31b6046d396407c4efbf238941c6b08.tar.bz2
rneovim-be1fbe38b31b6046d396407c4efbf238941c6b08.zip
feat(lua): vim.text.indent()
Problem: Indenting text is a common task in plugins/scripts for presentation/formatting, yet vim has no way of doing it (especially "dedent", and especially non-buffer text). Solution: Introduce `vim.text.indent()`. It sets the *exact* indentation because that's a more difficult (and thus more useful) task than merely "increasing the current indent" (which is somewhat easy with a `gsub()` one-liner).
Diffstat (limited to 'test/testutil.lua')
-rw-r--r--test/testutil.lua26
1 files changed, 4 insertions, 22 deletions
diff --git a/test/testutil.lua b/test/testutil.lua
index e69dcae120..3655a87d93 100644
--- a/test/testutil.lua
+++ b/test/testutil.lua
@@ -148,6 +148,7 @@ end
--- @param actual string
--- @return boolean
function M.matches(pat, actual)
+ assert(pat and pat ~= '', 'pat must be a non-empty string')
if nil ~= string.match(actual, pat) then
return true
end
@@ -641,28 +642,9 @@ end
--- @param leave_indent? integer
--- @return string
function M.dedent(str, leave_indent)
- -- find minimum common indent across lines
- local indent --- @type string?
- for line in str:gmatch('[^\n]+') do
- local line_indent = line:match('^%s+') or ''
- if indent == nil or #line_indent < #indent then
- indent = line_indent
- end
- end
-
- if not indent or #indent == 0 then
- -- no minimum common indent
- return str
- end
-
- local left_indent = (' '):rep(leave_indent or 0)
- -- create a pattern for the indent
- indent = indent:gsub('%s', '[ \t]')
- -- strip it from the first line
- str = str:gsub('^' .. indent, left_indent)
- -- strip it from the remaining lines
- str = str:gsub('[\n]' .. indent, '\n' .. left_indent)
- return str
+ -- Last blank line often has non-matching indent, so remove it.
+ str = str:gsub('\n[ ]+$', '\n')
+ return (vim.text.indent(leave_indent or 0, str))
end
function M.intchar2lua(ch)