local lsp = require("core.lsp.functions") return { "hrsh7th/nvim-cmp", requires = { "nvim-treesitter/nvim-treesitter", "lukas-reineke/cmp-under-comparator", -- better results "xzbdmw/colorful-menu.nvim" -- fancy colors }, -- suppliers for completions (they require nvim-cmp to be loaded before they are) deps = { "hrsh7th/cmp-buffer", -- buffers "FelipeLema/cmp-async-path", -- path { "hrsh7th/cmp-nvim-lsp", function() -- add lsp capabilities lsp.add_capabilities(require("cmp_nvim_lsp").default_capabilities()) end }, -- lsp "hrsh7th/cmp-nvim-lsp-signature-help", -- completion information { "L3MON4D3/cmp-luasnip-choice", -- luasnip requires = "L3MON4D3/LuaSnip" } }, function() local cmp = require("cmp") local luasnip = require("luasnip") -- setup cmp cmp.setup { -- disable when in comments enabled = function() local context = require("cmp.config.context") if vim.api.nvim_get_mode().mode == "c" then return true else return not context.in_treesitter_capture("comment") and not context.in_syntax_group("Comment") end end, -- completion sources sources = cmp.config.sources { { name = "nvim_lsp", priority = 999 }, { name = "luasnip_choice", priority = 750 }, { name = "buffer", max_item_count = 3 }, { name = "async_path", max_item_count = 5 }, { name = "neorg" }, { name = "nvim_lsp_signature_help" } }, -- how to sort results sorting = { comparators = { cmp.config.compare.exact, cmp.config.compare.offset, cmp.config.compare.score, require("cmp-under-comparator").under, cmp.config.compare.kind, cmp.config.compare.sort_text, cmp.config.compare.length, cmp.config.compare.order, } }, -- appearance of window window = { completion = { scrollbar = false, border = vim.g.border_style, winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC", }, documentation = { border = vim.g.border_style, winhighlight = "Normal:WinBarNC,FloatBorder:WinBarNC,Search:WinBarNC", } }, -- position of window view = { entries = { name = "custom", selection_order = "near_cursor" } }, -- formatting of content formatting = { fields = { "menu", "abbr", "kind" }, format = function(entry, item) local hl_info = require("colorful-menu").cmp_highlights(entry) local menu_icon = { nvim_lsp = "λ", luasnip = "%", buffer = "@", path = "#", async_path = "#" } -- add a little icon item.menu = menu_icon[entry.source.name] -- add highlights if hl_info ~= nil then item.abbr_hl_group = hl_info.highlights item.abbr = hl_info.text end return item end }, experimental = { ghost_text = true }, -- snippet integration snippet = { expand = function(args) luasnip.lsp_expand(args.body) end }, -- mappings mapping = cmp.mapping.preset.insert { [""] = cmp.mapping.confirm { select = true }, [""] = cmp.mapping.select_next_item(), [""] = cmp.mapping.select_prev_item(), [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.close() } } end }