local M = {} local cmp = require("cmp") local cmp_buffer = require("cmp_buffer") local luasnip = require("luasnip") local types = require("cmp.types") function M.setup() cmp.setup { snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, sources = { { name = "luasnip", option = { show_autosnippets = true } }, { name = "nvim_lsp" }, { name = "buffer", option = { -- Complete only on visible buffers. get_bufnrs = function() local bufs = {} for _, win in ipairs(vim.api.nvim_list_wins()) do bufs[vim.api.nvim_win_get_buf(win)] = true end return vim.tbl_keys(bufs) end }, }, }, sorting = { comparators = { -- Prioritize snippets over other sources. function(entry1, entry2) local kind1 = entry1:get_kind() local kind2 = entry2:get_kind() if kind1 ~= kind2 then if kind1 == types.lsp.CompletionItemKind.Snippet then return true end if kind2 == types.lsp.CompletionItemKind.Snippet then return false end end end, function(...) -- This also sorts completion results coming from other sources. return cmp_buffer:compare_locality(...) end, }, }, mapping = { [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.confirm({ select = true }) else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.abort() else fallback() end end, { "i", "s" }), [""] = 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" }), }, } end return M