local cmp_status_ok, cmp = pcall(require, "cmp") if not cmp_status_ok then return end local npm_status_ok, npm = pcall(require, "cmp-npm") if not npm_status_ok then return end local snip_status_ok, luasnip = pcall(require, "luasnip") if not snip_status_ok then return end local lspkind_status_ok, lspkind = pcall(require, "lspkind") if not lspkind_status_ok then return end require("luasnip/loaders/from_vscode").lazy_load() local check_backspace = function() local col = vim.fn.col(".") - 1 return col == 0 or vim.fn.getline("."):sub(col, col):match("%s") end npm.setup({}) cmp.setup({ snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = { [""] = cmp.mapping.select_prev_item(), [""] = cmp.mapping.select_next_item(), [""] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }), [""] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }), [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), [""] = cmp.config.disable, [""] = cmp.mapping({ i = cmp.mapping.abort(), c = cmp.mapping.close(), }), [""] = cmp.mapping.confirm({ select = true }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expandable() then luasnip.expand() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() elseif check_backspace() then fallback() 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", }), }, formatting = { fields = { "abbr", "kind", "menu" }, format = lspkind.cmp_format({ mode = "symbol_text", maxwidth = 50, before = function(entry, vim_item) vim_item.menu = ({ nvim_lsp = "[LSP]", npm = "[NPM]", crates = "[CRATES]", nvim_lua = "[NVIM_LUA]", luasnip = "[SNIPPET]", buffer = "[BUFFER]", path = "[PATH]", })[entry.source.name] return vim_item end, }), }, sources = { { name = "nvim_lsp" }, { name = "npm" }, { name = "crates" }, { name = "nvim_lua" }, { name = "luasnip" }, { name = "buffer" }, { name = "path" }, }, confirm_opts = { behavior = cmp.ConfirmBehavior.Replace, select = false, }, window = { documentation = { border = { "╭", "─", "╮", "│", "╯", "─", "╰", "│" }, }, }, experimental = { ghost_text = true, native_menu = false, }, }) cmp.setup.cmdline("/", { sources = { { name = "buffer" }, }, }) cmp.setup.cmdline(":", { sources = cmp.config.sources({ { name = "path" }, }, { { name = "cmdline" }, }), })