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

Posted aluluka

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始配置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'

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

配置

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

require('plugin-config/cmp')

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

local cmp = require("cmp")
local lspkind = require("lspkind")
cmp.setup(
    -- 设置代码片段引擎,用于根据代码片段补全
    snippet = 
        expand = function(args)
            vim.fn["vsnip#anonymous"](args.body)
        end,
    ,

    window = 
    ,

    mapping = 
        -- 选择上一个
        ['<C-p>'] = cmp.mapping.select_prev_item(),
        -- 选择下一个
        ['<C-n>'] = cmp.mapping.select_next_item(),
        -- 出现补全
        ['<A-.>'] = cmp.mapping(cmp.mapping.complete(), 'i', 'c'),
        -- 取消补全
        ['<A-,>'] = cmp.mapping(
            i = cmp.mapping.abort(),
            c = cmp.mapping.close(),
        ),

        -- 确认使用某个补全项
        ['<CR>'] = cmp.mapping.confirm(
            select = true,
            behavior = cmp.ConfirmBehavior.Replace
        ),

        -- 向上翻页
        ['<C-u>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), 'i', 'c'),
        -- 向下翻页
        ['<C-d>'] = 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
        ),
    ,
)

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


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

以上是关于从零开始配置vim(24)——自动补全的主要内容,如果未能解决你的问题,请参考以下文章

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

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(28)——代码的编译运行与调试

从零开始配置vim(28)——代码的编译运行与调试