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", }, opts = function(_, opts) opts.sources = opts.sources or {} table.insert(opts.sources, { name = "lazydev", group_index = 0, -- set group index to 0 to skip loading LuaLS completions }) end, 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, }, { 'mireq/luasnip-snippets', dependencies = { 'L3MON4D3/LuaSnip' }, init = function() require('luasnip_snippets.common.snip_utils').setup() end }, { "L3MON4D3/LuaSnip", version = "v2.*", dependencies = { 'nvim-treesitter/nvim-treesitter', }, build = "make install_jsregexp", opts = { history = false, region_check_events = 'InsertEnter', delete_check_events = 'InsertLeave', }, init = function() local ls = require('luasnip') ls.setup({ -- Required to automatically include base snippets, like "c" snippets for "cpp" load_ft_func = require('luasnip_snippets.common.snip_utils').load_ft_func, ft_func = require('luasnip_snippets.common.snip_utils').ft_func, -- To enable auto expansin enable_autosnippets = true, -- Uncomment to enable visual snippets triggered using -- store_selection_keys = '', }) -- LuaSnip key bindings vim.keymap.set({ "i", "s" }, "", function() if ls.expand_or_jumpable() then ls.expand_or_jump() else vim.api.nvim_input('') end end, { silent = true }) vim.keymap.set({ "i", "s" }, "", function() ls.jump(-1) end, { silent = true }) vim.keymap.set({ "i", "s" }, "", function() if ls.choice_active() then ls.change_choice(1) end end, { silent = true }) end }, }