return { { "hrsh7th/nvim-cmp", dependencies = { "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-nvim-lua", "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "hrsh7th/cmp-omni", "hrsh7th/cmp-nvim-lsp-signature-help", "L3MON4D3/LuaSnip", "saadparwaiz1/cmp_luasnip", "honza/vim-snippets", }, config = function() local cmp = require("cmp") local luasnip = require("luasnip") require("luasnip/loaders/from_vscode").lazy_load() local kind_icons = { Text = "󰊄", Method = "m", Function = "󰊕", Constructor = "", Field = "󰽏", Variable = "󰫧", Class = "󰌗", Interface = "", Module = "", Property = "", Unit = "", Value = "󰎠", Enum = "", Keyword = "", Snippet = "", Color = "󰏘", File = "󰈙", Reference = "", Folder = "󰉋", EnumMember = "", Constant = "󰇽", Struct = "", Event = "", Operator = "󰆕", TypeParameter = "", } ---@diagnostic disable-next-line: missing-fields cmp.setup({ enabled = function() -- disable autocompletion in telescope prompt local buftype = vim.api.nvim_buf_get_option(0, "buftype") return buftype ~= "prompt" end, ---@diagnostic disable-next-line: missing-fields completion = { completeopt = "menu,menuone,noselect", }, window = { documentation = cmp.config.window.bordered(), completion = cmp.config.window.bordered(), }, snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = false, }), [""] = 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" }), [""] = 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" }), }), ---@diagnostic disable-next-line: missing-fields formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) -- kind icons vim_item.kind = string.format("%s", kind_icons[vim_item.kind]) vim_item.menu = ({ nvim_lsp = "[ ]", nvim_lsp_signature_help = "[󰞋 ]", omni = "[ ]", luasnip = "[ ]", buffer = "[󰮳 ]", path = "[ ]", })[entry.source.name] return vim_item end, }, sources = { { name = "nvim_lsp" }, { name = "nvim_lsp_signature_help" }, { name = "luasnip" }, { name = "buffer" }, { name = "path" }, }, }) -- insert `(` after select function or method item local cmp_autopairs = require('nvim-autopairs.completion.cmp') cmp.event:on( 'confirm_done', cmp_autopairs.on_confirm_done() ) -- use omnifunc in vimwiki to complete paths and tags ---@diagnostic disable-next-line: missing-fields cmp.setup.filetype('vimwiki', { sources = cmp.config.sources({ { name = "omni" }, { name = "luasnip" }, { name = "buffer" }, { name = "path" }, option = { disable_omnifuncs = {}, }, }) }) end, }, { "L3MON4D3/LuaSnip", event = "InsertEnter", dependencies = { "honza/vim-snippets", }, build = "make install_jsregexp", keys = { { "", function() require("luasnip").expand_or_jump() end, mode = { "i", "s" }, }, }, opts = { history = false, region_check_events = 'InsertEnter', delete_check_events = 'InsertLeave', }, config = function(_, opts) require("luasnip").setup(opts) require("luasnip.loaders.from_snipmate").lazy_load() end, }, }