You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NeoVim Lua最小配置nvim-cmp搭配LSP无法选中补全项问题求解

解决方案

你当前的配置缺失两个核心部分:一是nvim-cmp必需的按键映射配置,二是使用了已经被废弃的旧版capabilities更新API。不需要安装snippet相关依赖,只要补全对应配置即可实现你要的交互效果。

最小可用配置(无额外依赖)

直接替换你原来的cmp相关代码即可,不需要安装任何额外插件:

local cmp = require("cmp")

-- 替换旧版废弃API,获取适配cmp的LSP客户端能力参数
local capabilities = require('cmp_nvim_lsp').default_capabilities()

cmp.setup {
  sources = {
    { name = 'nvim_lsp' }
  },
  -- 按键映射,完全使用cmp原生能力,无第三方依赖
  mapping = {
    -- 方向键上下导航补全项
    ['<Up>'] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }),
    ['<Down>'] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }),
    -- Tab切下一项,Shift+Tab切上一项
    ['<Tab>'] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }),
    ['<S-Tab>'] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }),
    -- 回车确认选中项
    ['<CR>'] = cmp.mapping.confirm({
      behavior = cmp.ConfirmBehavior.Insert,
      select = false, -- 未手动选中时回车不自动确认第一个候选,符合常规编辑习惯
    }),
  },
  -- 预留snippet配置项避免cmp启动校验报错,无snippet插件时不需要填充逻辑
  snippet = {
    expand = function() end
  },
}

-- 后续配置各个LSP时,把上面生成的capabilities传入对应LSP的setup参数即可
-- 示例:
-- require('lspconfig').lua_ls.setup({
--   capabilities = capabilities,
--   -- 其余自定义LSP配置
-- })

配置说明

  • 所有映射逻辑都是nvim-cmp原生提供的能力,不需要接入snippet引擎或其他第三方插件,完全符合精简配置的需求
  • SelectBehavior.Select参数表示导航补全项时仅高亮候选,不会提前把文本插入缓冲区,避免输入过程中被意外修改
  • ConfirmBehavior.Insert参数表示确认补全时,内容直接插入到当前光标位置,不会覆盖光标后方的已有文本
  • 空的snippet.expand函数仅用于通过nvim-cmp的启动配置校验,不会触发任何snippet相关逻辑
  • 替换了你原有配置中已废弃的update_capabilities接口,避免新版本nvim-cmp启动时弹出废弃警告

入门文档指引

不需要找零散的第三方教程,nvim-cmp的内置文档已经覆盖了所有基础配置逻辑:

  • 在Neovim中执行:help cmp-mapping可以查看所有原生支持的按键映射函数、参数说明
  • 执行:help cmp-config可以查看所有配置项的作用、可选值

内容的提问来源于stack exchange,提问作者Achim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:09:27