mirror of
https://github.com/neovim/neovim.git
synced 2024-12-24 21:25:04 -07:00
Merge pull request #27674 from glepnir/snippet_indent
fix(snippet): correct indent with newline
This commit is contained in:
commit
8350839a87
@ -446,14 +446,18 @@ function M.expand(input)
|
|||||||
base_indent = base_indent .. (snippet_lines[#snippet_lines]:match('(^%s*)%S') or '') --- @type string
|
base_indent = base_indent .. (snippet_lines[#snippet_lines]:match('(^%s*)%S') or '') --- @type string
|
||||||
end
|
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)
|
local lines = vim.iter.map(function(i, line)
|
||||||
-- Replace tabs by spaces.
|
-- Replace tabs by spaces.
|
||||||
if vim.o.expandtab then
|
if expandtab then
|
||||||
line = line:gsub('\t', (' '):rep(vim.fn.shiftwidth())) --- @type string
|
line = line:gsub('\t', (' '):rep(shiftwidth)) --- @type string
|
||||||
end
|
end
|
||||||
-- Add the base indentation.
|
-- Add the base indentation.
|
||||||
if i > 1 then
|
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
|
end
|
||||||
return line
|
return line
|
||||||
end, ipairs(text_to_lines(text)))
|
end, ipairs(text_to_lines(text)))
|
||||||
|
@ -5,6 +5,7 @@ local clear = helpers.clear
|
|||||||
local eq = helpers.eq
|
local eq = helpers.eq
|
||||||
local exec_lua = helpers.exec_lua
|
local exec_lua = helpers.exec_lua
|
||||||
local feed = helpers.feed
|
local feed = helpers.feed
|
||||||
|
local api = helpers.api
|
||||||
local fn = helpers.fn
|
local fn = helpers.fn
|
||||||
local matches = helpers.matches
|
local matches = helpers.matches
|
||||||
local pcall_err = helpers.pcall_err
|
local pcall_err = helpers.pcall_err
|
||||||
@ -230,7 +231,7 @@ describe('vim.snippet', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it('updates snippet state when built-in completion menu is visible', function()
|
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.
|
-- Show the completion menu.
|
||||||
feed('<C-n>')
|
feed('<C-n>')
|
||||||
-- Make sure no item is selected.
|
-- Make sure no item is selected.
|
||||||
@ -238,6 +239,28 @@ describe('vim.snippet', function()
|
|||||||
-- Jump forward (the 2nd tabstop).
|
-- Jump forward (the 2nd tabstop).
|
||||||
exec_lua('vim.snippet.jump(1)')
|
exec_lua('vim.snippet.jump(1)')
|
||||||
feed('foo')
|
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)
|
||||||
end)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user