local has_words_before = function() unpack = unpack or table.unpack local line, col = unpack(vim.api.nvim_win_get_cursor(0)) return col ~= 0 and vim.api.nvim_buf_get_lines( 0, line - 1, line, true )[1]:sub(col, col):match('%s') == nil end local get_ws = function (max, len) return (" "):rep(max - len) end -- Add additional capabilities supported by nvim-cmp local capabilities = require('cmp_nvim_lsp').default_capabilities() local luasnip = require("luasnip") local kind_icons = { Text = "", Method = "󰆧", Function = "󰊕", Constructor = "", Field = "󰇽", Variable = "󰂡", Class = "󰠱", Interface = "", Module = "", Property = "󰜢", Unit = "", Value = "󰎠", Enum = "", Keyword = "󰌋", Snippet = "", Color = "󰏘", File = "󰈙", Reference = "", Folder = "󰉋", EnumMember = "", Constant = "󰏿", Struct = "", Event = "", Operator = "󰆕", TypeParameter = "󰅲", } -- nvim-cmp setup local cmp = require 'cmp' cmp.setup { mapping = { [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() -- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable() -- they way you will only jump inside the snippet region elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() elseif has_words_before() then cmp.complete() 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" }), [""] = cmp.mapping(cmp.mapping.scroll_docs(-4), {'i', 'c'}), [""] = cmp.mapping(cmp.mapping.scroll_docs(4), {'i', 'c'}), [""] = cmp.mapping(cmp.mapping.complete(), {'i', 'c'}), [""] = cmp.mapping({ i = cmp.mapping.close(), c = cmp.mapping.close() }), }, formatting = { format = function(_, vim_item) vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) local content = vim_item.abbr if #content > 25 then vim_item.abbr = vim.fn.strcharpart(content, 0, 25) .. "…" else vim_item.abbr = content .. get_ws(25, #content) end return vim_item end, }, sources = { {name = 'path'}, {name = 'nvim_lsp', keyword_length = 1}, {name = 'buffer', keyword_length = 3}, {name = 'luasnip', keyword_length = 2}, }, }