return { "hrsh7th/nvim-cmp", dependencies = { -- Snippet Engine & its associated nvim-cmp source { "L3MON4D3/LuaSnip", build = (function() -- Build Step is needed for regex support in snippets. -- This step is not supported in many windows environments. -- Remove the below condition to re-enable on windows. if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then return end return "make install_jsregexp" end)(), dependencies = { -- `friendly-snippets` contains a variety of premade snippets. -- See the README about individual language/framework/plugin snippets: -- https://github.com/rafamadriz/friendly-snippets { "rafamadriz/friendly-snippets", config = function() require("luasnip.loaders.from_vscode").lazy_load() end, }, }, }, "saadparwaiz1/cmp_luasnip", -- Adds other completion capabilities. -- nvim-cmp does not ship with all sources by default. They are split -- into multiple repos for maintenance purposes. "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-buffer", "hrsh7th/cmp-path", }, config = function() -- See `:help cmp` local cmp = require("cmp") local luasnip = require("luasnip") luasnip.config.setup({}) 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 = "󰊄", } cmp.setup({ snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, completion = { completeopt = "menu,menuone,noselect" }, preselect = cmp.PreselectMode.None, -- For an understanding of why these mappings were -- chosen, you will need to read `:help ins-completion` -- -- No, but seriously. Please read `:help ins-completion`, it is really good! mapping = cmp.mapping.preset.insert({ -- Select the [n]ext item [""] = cmp.mapping.select_next_item(), -- Select the [p]revious item [""] = cmp.mapping.select_prev_item(), -- Scroll the documentation window [b]ack / [f]orward [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), -- Accept ([y]es) the completion. -- This will auto-import if your LSP supports it. -- This will expand snippets if the LSP sent a snippet. [""] = cmp.mapping.confirm({ select = true }), -- If you prefer more traditional completion keymaps, -- you can uncomment the following lines --[''] = cmp.mapping.confirm { select = true }, --[''] = cmp.mapping.select_next_item(), --[''] = cmp.mapping.select_prev_item(), -- Manually trigger a completion from nvim-cmp. -- Generally you don't need this, because nvim-cmp will display -- completions whenever it has completion options available. [""] = cmp.mapping.complete({}), -- Think of as moving to the right of your snippet expansion. -- So if you have a snippet that's like: -- function $name($args) -- $body -- end -- -- will move you to the right of each of the expansion locations. -- is similar, except moving you backwards. -- [''] = cmp.mapping(function() -- if luasnip.expand_or_locally_jumpable() then -- luasnip.expand_or_jump() -- end -- end, { 'i', 's' }), -- [''] = cmp.mapping(function() -- if luasnip.locally_jumpable(-1) then -- luasnip.jump(-1) -- end -- end, { 'i', 's' }), }), sources = { { name = "lazydev", -- set group index to 0 to skip loading LuaLS completions as lazydev recommends it group_index = 0, }, { name = "nvim_lsp" }, { name = "luasnip" }, { name = "buffer" }, { name = "path" }, }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) 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, }, }) end, }