aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/completion.lua
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/vim/lsp/completion.lua')
-rw-r--r--runtime/lua/vim/lsp/completion.lua70
1 files changed, 40 insertions, 30 deletions
diff --git a/runtime/lua/vim/lsp/completion.lua b/runtime/lua/vim/lsp/completion.lua
index 71ea2df100..92bc110a97 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
@@ -221,6 +220,20 @@ local function get_doc(item)
return ''
end
+---@param value string
+---@param prefix string
+---@return boolean
+local function match_item_by_value(value, prefix)
+ if vim.o.completeopt:find('fuzzy') ~= nil then
+ return next(vim.fn.matchfuzzy({ value }, prefix)) ~= nil
+ end
+
+ if vim.o.ignorecase and (not vim.o.smartcase or not prefix:find('%u')) then
+ return vim.startswith(value:lower(), prefix:lower())
+ end
+ return vim.startswith(value, prefix)
+end
+
--- Turns the result of a `textDocument/completion` request into vim-compatible
--- |complete-items|.
---
@@ -245,8 +258,16 @@ function M._lsp_to_complete_items(result, prefix, client_id)
else
---@param item lsp.CompletionItem
matches = function(item)
- local text = item.filterText or item.label
- return next(vim.fn.matchfuzzy({ text }, prefix)) ~= nil
+ if item.filterText then
+ return match_item_by_value(item.filterText, prefix)
+ end
+
+ if item.textEdit then
+ -- server took care of filtering
+ return true
+ end
+
+ return match_item_by_value(item.label, prefix)
end
end
@@ -272,7 +293,7 @@ function M._lsp_to_complete_items(result, prefix, client_id)
icase = 1,
dup = 1,
empty = 1,
- hl_group = hl_group,
+ abbr_hlgroup = hl_group,
user_data = {
nvim = {
lsp = {
@@ -316,7 +337,7 @@ local function adjust_start_col(lnum, line, items, encoding)
end
end
if min_start_char then
- return lsp.util._str_byteindex_enc(line, min_start_char, encoding)
+ return vim.str_byteindex(line, encoding, min_start_char, false)
else
return nil
end
@@ -539,35 +560,24 @@ 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
if command then
- client:_exec_cmd(command, { bufnr = bufnr }, nil, function()
- vim.lsp.log.warn(
- string.format(
- 'Language server `%s` does not support command `%s`. This command may require a client extension.',
- client.name,
- command.command
- )
- )
- end)
+ client:exec_cmd(command, { bufnr = bufnr })
end
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 +587,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,16 +597,16 @@ 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
--- @class vim.lsp.completion.BufferOpts
---- @field autotrigger? boolean Whether to trigger completion automatically. Default: false
+--- @field autotrigger? boolean Default: false When true, completion triggers automatically based on the server's `triggerCharacters`.
--- @field convert? fun(item: lsp.CompletionItem): table Transforms an LSP CompletionItem to |complete-items|.
---@param client_id integer