return { -- Autocompletion 'hrsh7th/nvim-cmp', -- event = 'InsertEnter', 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)(), }, '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', -- Adds a number of user-friendly snippets 'rafamadriz/friendly-snippets', }, config = function() local cmp = require 'cmp' require('luasnip.loaders.from_vscode').lazy_load() 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,noinsert' }, -- window = { -- completion = cmp.config.window.bordered(), -- documentation = cmp.config.window.bordered(), -- }, mapping = cmp.mapping.preset.insert { [''] = cmp.mapping.select_next_item(), -- Select the [n]ext item [''] = cmp.mapping.select_prev_item(), -- Select the [p]revious item [''] = cmp.mapping.confirm { select = true }, -- Accept the completion with Enter. [''] = cmp.mapping.complete {}, -- Manually trigger a completion from nvim-cmp. -- 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' }), -- Select next/previous item with Tab / Shift + Tab [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_locally_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.locally_jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's' }), }, sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'buffer' }, { name = 'path' }, }, 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.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind vim_item.menu = ({ nvim_lsp = '[LSP]', luasnip = '[Snippet]', buffer = '[Buffer]', path = '[Path]', })[entry.source.name] return vim_item end, }, } end, }