如何在Neovim的nvim-lspconfig+nvim-cmp中过滤自动补全文本片段
过滤nvim-cmp自动补全菜单中的文本片段
你可以通过以下几种方式过滤nvim-cmp补全菜单中的文本片段(snippet类条目):
全局过滤所有补全条目
在nvim-cmp的配置中添加全局过滤规则,直接剔除所有snippet类型的补全项:
require('cmp').setup({ -- 保留你的其他配置(比如mapping、sources等) filtering = { enabled = true, entries = { filter = function(entry, ctx) -- LSP规范中,completionItemKind.Snippet对应数值15,过滤该类型条目 return entry:get_kind() ~= 15 end } } })
禁用特定LSP服务器的snippet支持
如果只想让某个LSP不返回snippet补全,可以修改该服务器的capabilities,关闭snippet支持:
-- 先获取默认capabilities local capabilities = require('cmp_nvim_lsp').default_capabilities() -- 禁用snippet支持,LSP将不再返回snippet类型的补全项 capabilities.textDocument.completion.completionItem.snippetSupport = false -- 以pyright为例,应用修改后的capabilities require('lspconfig').pyright.setup({ capabilities = capabilities, -- 你的其他LSP配置 })
针对单个nvim-cmp source过滤
如果只想过滤某个cmp source(比如nvim_lsp)下的snippet,可给该source单独设置过滤规则:
require('cmp').setup({ sources = { { name = 'nvim_lsp', entry_filter = function(entry, ctx) -- 仅过滤该source下的snippet条目 return entry:get_kind() ~= 15 end }, -- 其他source配置(比如buffer、path等) } })
补充说明
如果不确定目标条目的kind值,可以在补全菜单弹出时,执行以下命令查看当前激活条目的kind数值:
:lua print(vim.inspect(require('cmp').get_active_entry():get_kind()))
LSP规范中,completionItemKind的枚举值里,Snippet类型对应的数值为15。
内容的提问来源于stack exchange,提问作者Massimiliano
相关产品推荐
相关产品推荐

