fix(snippet): correct indent with newline

Problem: snippet newline use before line indent after expand.

Solution: it should level + 1.
This commit is contained in:
glepnir 2024-02-29 18:50:40 +08:00
parent 0eaae1bc05
commit a5ade3c63d
2 changed files with 32 additions and 5 deletions

View File

@ -446,14 +446,18 @@ function M.expand(input)
base_indent = base_indent .. (snippet_lines[#snippet_lines]:match('(^%s*)%S') or '') --- @type string
end
local shiftwidth = vim.fn.shiftwidth()
local curbuf = vim.api.nvim_get_current_buf()
local expandtab = vim.bo[curbuf].expandtab
local lines = vim.iter.map(function(i, line)
-- Replace tabs by spaces.
if vim.o.expandtab then
line = line:gsub('\t', (' '):rep(vim.fn.shiftwidth())) --- @type string
if expandtab then
line = line:gsub('\t', (' '):rep(shiftwidth)) --- @type string
end
-- Add the base indentation.
if i > 1 then
line = base_indent .. line
line = #line ~= 0 and base_indent .. line
or (expandtab and (' '):rep(shiftwidth) or '\t'):rep(vim.fn.indent('.') / shiftwidth + 1)
end
return line
end, ipairs(text_to_lines(text)))

View File

@ -5,6 +5,7 @@ local clear = helpers.clear
local eq = helpers.eq
local exec_lua = helpers.exec_lua
local feed = helpers.feed
local api = helpers.api
local fn = helpers.fn
local matches = helpers.matches
local pcall_err = helpers.pcall_err
@ -230,7 +231,7 @@ describe('vim.snippet', function()
end)
it('updates snippet state when built-in completion menu is visible', function()
test_expand_success({ '$1 = function($2)\n$3\nend' }, { ' = function()', '', 'end' })
test_expand_success({ '$1 = function($2)\nend' }, { ' = function()', 'end' })
-- Show the completion menu.
feed('<C-n>')
-- Make sure no item is selected.
@ -238,6 +239,28 @@ describe('vim.snippet', function()
-- Jump forward (the 2nd tabstop).
exec_lua('vim.snippet.jump(1)')
feed('foo')
eq({ ' = function(foo)', '', 'end' }, buf_lines(0))
eq({ ' = function(foo)', 'end' }, buf_lines(0))
end)
it('correctly indents with newlines', function()
local curbuf = api.nvim_get_current_buf()
test_expand_success(
{ 'function($2)\n$3\nend' },
{ 'function()', ' ', 'end' },
[[
vim.opt.sw = 2
vim.opt.expandtab = true
]]
)
api.nvim_buf_set_lines(curbuf, 0, -1, false, {})
test_expand_success(
{ 'func main() {\n$1\n}' },
{ 'func main() {', '\t', '}' },
[[
vim.opt.sw = 4
vim.opt.ts = 4
vim.opt.expandtab = false
]]
)
end)
end)