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

nvim-cmp在lazy.nvim中无法补全C++关键字与函数的问题求助

解决nvim-cmp无法补全C++关键字/函数的问题

问题根源

你配置了cmp-nvim-lsp作为补全源,但没有启动C++对应的LSP服务器(如clangd),导致nvim_lsp源没有实际的C++语言支持数据,只能靠buffer源补全之前输入过的内容。

解决步骤

1. 安装clangd

先在系统层面安装clangd:

  • Ubuntu/Debian:sudo apt install clangd
  • macOS:brew install clangd
  • Windows:通过LLVM官网下载安装包,或用Chocolatey执行choco install llvm

2. 修改nvim-cmp配置

添加nvim-lspconfig依赖,并配置启动clangd,同时把cmp的capabilities传给LSP,让nvim-cmp能接收补全数据。修改后的完整配置如下:

return {
    {
        'hrsh7th/nvim-cmp',
        lazy = false,
        priority = 100,
        dependencies = {
            'hrsh7th/cmp-nvim-lsp',
            'hrsh7th/cmp-buffer',
            'hrsh7th/cmp-path',
            'hrsh7th/cmp-nvim-lsp-signature-help',
            'onsails/lspkind.nvim',
            'ray-x/cmp-treesitter',
            'L3MON4D3/LuaSnip',
            'neovim/nvim-lspconfig' -- 新增:引入lspconfig管理LSP服务器
        },
        event = "InsertEnter",
        config = function()
            local cmp = require 'cmp'
            local luasnip = require 'luasnip'

            -- 配置LSP客户端能力,让nvim-cmp能接收LSP的补全信息
            local capabilities = require('cmp_nvim_lsp').default_capabilities()

            -- 启动clangd服务,传入配置好的capabilities
            require('lspconfig').clangd.setup({
                capabilities = capabilities
            })

            cmp.setup {
                snippet = {
                    expand = function(args)
                        luasnip.lsp_expand(args.body)
                    end,
                },
                formatting = {
                    format = require 'lspkind'.cmp_format {
                        mode = "symbol_text",
                        menu = {
                            nvim_lsp = "[LSP]",
                            buffer = "[Buffer]",
                            luasnip = "[LuaSnip]",
                            calc = "[Calc]",
                            path = "[Path]",
                            treesitter = "[TS]"
                        }
                    }
                },
                window = {
                    completion = cmp.config.window.bordered(),
                    documentation = cmp.config.window.bordered(),
                },
                view = {
                    entries = {
                        name = 'custom',
                        selection_order = 'near_cursor'
                    }
                },
                mapping = cmp.mapping.preset.insert({
                    ['<C-b>'] = cmp.mapping.scroll_docs(-4),
                    ['<C-f>'] = cmp.mapping.scroll_docs(4),
                    ['<C-Space>'] = cmp.mapping.complete(),
                    ['<CR>'] = cmp.mapping.confirm {
                        behavior = cmp.ConfirmBehavior.Replace,
                        select = true,
                    },
                    ['<Tab>'] = cmp.mapping(function(fallback)
                        if cmp.visible() then
                            cmp.select_next_item()
                        elseif luasnip.expand_or_jumpable() then
                            luasnip.expand_or_jump()
                        else
                            fallback()
                        end
                    end, { 'i', 's' }),
                    ['<S-Tab>'] = cmp.mapping(function(fallback)
                        if cmp.visible() then
                            cmp.select_prev_item()
                        elseif luasnip.jumpable(-1) then
                            luasnip.jump(-1)
                        else
                            fallback()
                        end
                    end, { 'i', 's' }),
                }),
                sources = cmp.config.sources({
                    { name = 'nvim_lsp' }, -- 现在会加载clangd提供的C++补全
                    { name = 'luasnip' },
                    { name = 'buffer' },
                    { name = 'calc' },
                    { name = 'path' },
                    { name = 'treesitter' },
                })
            }
        end
    }
}

3. 额外配置(可选)

  • 如果clangd不在系统默认PATH中,需要在clangd.setup里指定路径:
    require('lspconfig').clangd.setup({
        capabilities = capabilities,
        cmd = { "/your/path/to/clangd" }
    })
    
  • 若要让cmp-treesitter也提供关键字补全,确保已安装C++的treesitter语法:执行:TSInstall cpp

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:12:28