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来源于当前 buffer 、cmd-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 = {

-- 选择上一个

[''] = 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

}),

},

})

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

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

好文链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。