return { { "hrsh7th/nvim-cmp", event = "InsertEnter", dependencies = { "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-nvim-lua", "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", "L3MON4D3/LuaSnip", "saadparwaiz1/cmp_luasnip", "rafamadriz/friendly-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 prompt local buftype = vim.api.nvim_buf_get_option(0, "buftype") if buftype == "prompt" then return false end local context = require 'cmp.config.context' -- disable autocompletion in comments return not context.in_treesitter_capture("comment") and not context.in_syntax_group("Comment") 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.select_prev_item(), [""] = cmp.mapping.select_next_item(), [""] = 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 = "[lsp]", luasnip = "[snippet]", buffer = "[buffer]", path = "[path]", })[entry.source.name] return vim_item end, }, sources = { { name = "nvim_lsp" }, { 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() ) ---@diagnostic disable-next-line: missing-fields cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'git' }, }, { { name = 'buffer' }, }) }) -- use buffer source for `/` . ---@diagnostic disable-next-line: missing-fields cmp.setup.cmdline('/', { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) -- use cmdline & path source for ':' . ---@diagnostic disable-next-line: missing-fields cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) end, }, }