• 从零开始配置vim(24)——自动补全


    neovim 自带的代码补全的效果并不好,而且它分为好多类,如果需要人为的去判断使用路径补全、使用当前buffer中的单词补全、亦或者使用include 来进行补全,那样使用起来就很不方便了。针对代码的补全我们可以基于 lsp的配置使用插件来完成,这里我推荐使用 nvim-cmp插件

    安装

    我们使用下面的代码进行安装

    -- nvim-cmp
    use {'hrsh7th/cmp-nvim-lsp'}
    use {'hrsh7th/cmp-buffer'}
    use {'hrsh7th/cmp-path'}
    use {'hrsh7th/cmp-cmdline'}
    use {'hrsh7th/nvim-cmp'}
    -- vsnip
    use {'hrsh7th/cmp-vsnip'} 
    use {'hrsh7th/vim-vsnip'}
    use {'rafamadriz/friendly-snippets'}
    -- lspkind
    use {'onsails/lspkind-nvim'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    看着好像要安装好多插件,但是真正重要的就只有 nvim-cmp 剩下的以 cmp- 开头的都是在指定补全的来源,就像 neovim 自带补全功能可以来源于当前buffer、路径、引用一样,该插件的补全项也来源于各个地方。例如 cmp-nvim-lsp来源于语言的 lsp 服务端、cmp-buffer来源于当前 buffercmd-path来源于路径

    配置

    我们还是按照原来的惯例进行配置,新增一个 plugin-config/cmp.lua 的配置文件,并且加载它

    require('plugin-config/cmp')
    
    • 1

    在该配置文件中我们加入如下内容

    local cmp = require("cmp")
    local lspkind = require("lspkind")
    cmp.setup({
        -- 设置代码片段引擎,用于根据代码片段补全
        snippet = {
            expand = function(args)
                vim.fn["vsnip#anonymous"](args.body)
            end,
        },
    
        window = {
        },
    
        mapping = {
            -- 选择上一个
            [''] = cmp.mapping.select_prev_item(),
            -- 选择下一个
            [''] = cmp.mapping.select_next_item(),
            -- 出现补全
            [''] = cmp.mapping(cmp.mapping.complete(), {'i', 'c'}),
            -- 取消补全
            [''] = cmp.mapping({
                i = cmp.mapping.abort(),
                c = cmp.mapping.close(),
            }),
    
            -- 确认使用某个补全项
            [''] = cmp.mapping.confirm({
                select = true,
                behavior = cmp.ConfirmBehavior.Replace
            }),
    
            -- 向上翻页
            [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), {'i', 'c'}),
            -- 向下翻页
            [''] = cmp.mapping(cmp.mapping.scroll_docs(4), {'i', 'c'}),
        },
    
        -- 补全来源
        sources = cmp.config.sources({
            {name = 'nvim_lsp'},
            {name = 'vsnip'},
            {name = 'buffer'},
            {name = 'path'}
        }),
    
        --根据文件类型来选择补全来源
        cmp.setup.filetype('gitcommit', {
            sources = cmp.config.sources({
                {name = 'buffer'}
            })
        }),
    
        -- 命令模式下输入 `/` 启用补全
        cmp.setup.cmdline('/', {
            mapping = cmp.mapping.preset.cmdline(),
            sources = {
                { name = 'buffer' }
            }
        }),
    
        -- 命令模式下输入 `:` 启用补全
        cmp.setup.cmdline(':', {
            mapping = cmp.mapping.preset.cmdline(),
            sources = cmp.config.sources({
                { name = 'path' }
            }, {
                    { name = 'cmdline' }
                })
        }),
    
        -- 设置补全显示的格式
        formatting = {
            format = lspkind.cmp_format({
                with_text = true,
                maxwidth = 50,
                before = function(entry, vim_item)
                    vim_item.menu = "[" .. string.upper(entry.source.name) .. "]"
                    return vim_item
                end
            }),
        },
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    配置之后我们就可以使用自动补全相关功能了

    在这里插入图片描述
    本篇的内容到此结束了,后面我们再次以 c/c++以及 python为例来演示如何进行 lsp相关的配置。帮助大家巩固一下这方面的内容。

  • 相关阅读:
    一文带你入门微服务,通俗易懂
    第 7 章 图形用户界面参考答案
    【面试经典150 | 双指针】判断子序列
    MySQL 中读写分离数据延迟
    Java注解和反射学习
    微信小程序 24 播放音乐页的完善①
    【算法】一类支持向量机OC-SVM(2)
    如何用Postman做接口自动化测试?一文5个步骤带你成功实现!
    el-aside中添加el-menu设置collapse宽度自适应
    Python之字符串判断
  • 原文地址:https://blog.csdn.net/lanuage/article/details/126757766