Neovim中lua cmp/lsp-config仅补全标准内容,无法补全自定义变量与函数
问题描述
- Neovim配置了
mason.nvim、mason-lspconfig.nvim、nvim-lspconfig及nvim-cmp系列补全插件 - 自动补全能正常加载代码片段,无运行报错
- 通过
:LspInfo确认lua_ls、clangd已正常附着并运行,但无法补全自定义变量与函数
解决方案
针对Lua语言(lua_ls)
lua_ls默认未完全扫描当前项目文件,需添加工作区配置让它感知项目内的自定义内容:
修改nvim-lspconfig中lua_ls的setup代码:
lspconfig.lua_ls.setup({ capabilities = capabilities, settings = { Lua = { runtime = { version = 'LuaJIT', }, diagnostics = { globals = {'vim'}, }, workspace = { -- 让lua_ls识别Neovim运行时文件及当前项目文件 library = vim.api.nvim_get_runtime_file("", true), -- 关闭第三方库检查,避免干扰项目自定义内容识别 checkThirdParty = false, }, telemetry = { enable = false, }, }, }, })
针对C/C++语言(clangd)
clangd依赖编译信息来识别项目结构,需确保它能读取到项目的编译配置:
- CMake项目:构建时添加参数生成
compile_commands.json:
将生成的cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..compile_commands.json放在项目根目录,clangd会自动加载。 - 手动配置clangd:若未使用构建工具,可在setup中指定编译参数:
lspconfig.clangd.setup({ capabilities = capabilities, cmd = { "clangd", "--compile-commands-dir=.", -- 指定编译配置文件目录 "--query-driver=/usr/bin/clang++", -- 替换为你的编译器路径 }, }) - 确保打开文件前已通过
:cd进入项目根目录,让clangd识别当前工作区。
优化补全源优先级
调整nvim-cmp的源优先级,确保LSP补全(自定义内容由LSP提供)优先显示:
sources = cmp.config.sources({ { name = 'nvim-lsp', priority = 1000 }, -- 最高优先级 { name = 'luasnip', priority = 750 }, { name = 'buffer', priority = 500 }, })
验证步骤
- 保存修改后的配置,重启Neovim
- 打开包含自定义变量/函数的文件,等待LSP初始化完成
- 输入自定义名称的前缀,检查补全提示是否出现
内容的提问来源于stack exchange,提问作者abdja2
相关产品推荐
相关产品推荐

