return { { -- lsp补全 "hrsh7th/nvim-cmp", dependencies = { 'hrsh7th/cmp-nvim-lsp', 'hrsh7th/cmp-buffer', 'hrsh7th/cmp-path', 'hrsh7th/cmp-cmdline', { 'hrsh7th/vim-vsnip', config = function() G.g.vsnip_snippet_dir = G.fn.stdpath("config") .. "/snippets" end }, 'hrsh7th/cmp-vsnip', 'onsails/lspkind-nvim', }, config = function() local has_words_before = function() local unpack = table.unpack local line, col = unpack(G.api.nvim_win_get_cursor(0)) return col ~= 0 and G.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match('%s') == nil end local feedkey = function(key, mode) vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true) end local cmp = require('cmp') local cmp_opt = { snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end, }, sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'vsnip' }, }, { name = 'buffer' }, { name = 'path' } ), mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping({ i = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }), c = function(fallback) if cmp.visible() then cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false }) else fallback() end end, }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif vim.fn["vsnip#available"](1) == 1 then feedkey("(vsnip-expand-or-jump)", "") elseif has_words_before() then cmp.complete() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function() if cmp.visible() then cmp.select_prev_item() elseif vim.fn["vsnip#jumpable"](-1) == 1 then feedkey("(vsnip-jump-prev)", "") end end, { "i", "s" }), }), window = { completion = { winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None", col_offset = -3, side_padding = 0, border = "rounded", scrollbar = false, }, documentation = { winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None", border = "rounded", scrollbar = false, }, }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 50, })(entry, vim_item) local strings = vim.split(kind.kind, "%s", { trimempty = true }) kind.kind = " " .. (strings[1] or "") .. " " kind.menu = " (" .. (strings[2] or "") .. ")" return kind end, }, } require('cmp').setup(cmp_opt) end, }, }