aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/completion.lua
diff options
context:
space:
mode:
authorTomasz N <przepompownia@users.noreply.github.com>2024-10-10 11:40:03 +0200
committerGitHub <noreply@github.com>2024-10-10 11:40:03 +0200
commitb3109084c2c3675aa886bf16ff15f50025f30096 (patch)
tree3fbd9a0fc4d4c2802e93c853f0f6cd4997be55e5 /runtime/lua/vim/lsp/completion.lua
parent641c4b1a2acbf4d93142af9799dd13539b6ecde9 (diff)
downloadrneovim-b3109084c2c3675aa886bf16ff15f50025f30096.tar.gz
rneovim-b3109084c2c3675aa886bf16ff15f50025f30096.tar.bz2
rneovim-b3109084c2c3675aa886bf16ff15f50025f30096.zip
fix(lsp): fix cursor position after snippet expansion (#30659)
Problem: on `CompleteDone` cursor can jump to the end of line instead of the end of the completed word. Solution: remove only inserted word for snippet expansion instead of everything until eol. Fixes #30656 Co-authored-by: Mathias Fussenegger <f.mathias@zignar.net> Co-authored-by: Justin M. Keyes <justinkz@gmail.com>
Diffstat (limited to 'runtime/lua/vim/lsp/completion.lua')
-rw-r--r--runtime/lua/vim/lsp/completion.lua28
1 files changed, 12 insertions, 16 deletions
diff --git a/runtime/lua/vim/lsp/completion.lua b/runtime/lua/vim/lsp/completion.lua
index e74f993356..14fad987e0 100644
--- a/runtime/lua/vim/lsp/completion.lua
+++ b/runtime/lua/vim/lsp/completion.lua
@@ -113,12 +113,11 @@ local function parse_snippet(input)
end
--- @param item lsp.CompletionItem
---- @param suffix? string
-local function apply_snippet(item, suffix)
+local function apply_snippet(item)
if item.textEdit then
- vim.snippet.expand(item.textEdit.newText .. suffix)
+ vim.snippet.expand(item.textEdit.newText)
elseif item.insertText then
- vim.snippet.expand(item.insertText .. suffix)
+ vim.snippet.expand(item.insertText)
end
end
@@ -539,15 +538,12 @@ local function on_complete_done()
-- Remove the already inserted word.
local start_char = cursor_col - #completed_item.word
- local line = api.nvim_buf_get_lines(bufnr, cursor_row, cursor_row + 1, true)[1]
- api.nvim_buf_set_text(bufnr, cursor_row, start_char, cursor_row, #line, { '' })
- return line:sub(cursor_col + 1)
+ api.nvim_buf_set_text(bufnr, cursor_row, start_char, cursor_row, cursor_col, { '' })
end
- --- @param suffix? string
- local function apply_snippet_and_command(suffix)
+ local function apply_snippet_and_command()
if expand_snippet then
- apply_snippet(completion_item, suffix)
+ apply_snippet(completion_item)
end
local command = completion_item.command
@@ -565,9 +561,9 @@ local function on_complete_done()
end
if completion_item.additionalTextEdits and next(completion_item.additionalTextEdits) then
- local suffix = clear_word()
+ clear_word()
lsp.util.apply_text_edits(completion_item.additionalTextEdits, bufnr, offset_encoding)
- apply_snippet_and_command(suffix)
+ apply_snippet_and_command()
elseif resolve_provider and type(completion_item) == 'table' then
local changedtick = vim.b[bufnr].changedtick
@@ -577,7 +573,7 @@ local function on_complete_done()
return
end
- local suffix = clear_word()
+ clear_word()
if err then
vim.notify_once(err.message, vim.log.levels.WARN)
elseif result and result.additionalTextEdits then
@@ -587,11 +583,11 @@ local function on_complete_done()
end
end
- apply_snippet_and_command(suffix)
+ apply_snippet_and_command()
end, bufnr)
else
- local suffix = clear_word()
- apply_snippet_and_command(suffix)
+ clear_word()
+ apply_snippet_and_command()
end
end