local cmp = require "cmp" local lspkind = require "lspkind" local luasnip = require "luasnip" local cmp_autopairs = require "nvim-autopairs.completion.cmp" local compare = require "cmp.config.compare" cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done { map_char = { tex = "" } }) cmp.setup { window = { completion = { border = "rounded", -- winhighlight = 'Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None', -- winblend = vim.o.pumblend, -- scrolloff = 0, -- col_offset = 0, -- side_padding = 1, -- scrollbar = true, }, documentation = { -- max_height = math.floor(WIDE_HEIGHT * (WIDE_HEIGHT / vim.o.lines)), -- max_width = math.floor((WIDE_HEIGHT * 2) * (vim.o.columns / (WIDE_HEIGHT * 2 * 16 / 9))), border = "rounded", -- winhighlight = 'FloatBorder:NormalFloat', -- winblend = vim.o.pumblend, }, }, mapping = { [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.close() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.choice_active() then luasnip.change_choice(1) else fallback() end end, { "i", "s" }), [""] = cmp.mapping.select_prev_item(), [""] = cmp.mapping.select_next_item(), [""] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Insert, select = true, }, [""] = cmp.mapping.complete(), }, sources = { { name = "dictionary", keyword_length = 2 }, { name = "nvim_lua" }, { name = "nvim_lsp" }, { name = "path" }, { name = "luasnip" }, { name = "copilot" }, { name = "codeium" }, -- { name = 'cmp_ai' }, { name = "html-css", option = { spa = { enable = false, -- SPA mode is disabled by default entry_file = "index.html", -- if entry_file is omitted, it defaults to index.html in root dir }, max_count = {}, -- not ready yet enable_on = { "html", "css" }, -- set the file types you want the plugin to work on file_extensions = { "css", "sass", "less" }, -- set the local filetypes from which you want to derive classes style_sheets = { -- example of remote styles, only css no js for now "https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css", "https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css", }, }, }, { name = "buffer", keyword_length = 4, option = { get_bufnrs = function() local bufs = {} for _, win in ipairs(vim.api.nvim_list_wins()) do local bufnr = vim.api.nvim_win_get_buf(win) local buftype = vim.api.nvim_get_option_value("buftype", { buf = bufnr }) if buftype ~= "terminal" then bufs[bufnr] = true end end return vim.tbl_keys(bufs) end, }, }, }, snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, formatting = { format = function(entry, vim_item) if entry.source.name == "html-css" then source_mapping["html-css"] = "[" .. entry.completion_item.provider .. "]" or "[html-css]" end local KIND_ICONS = { Tailwind = "󰹞󰹞󰹞󰹞󰹞󰹞󰹞󰹞", Copilot = "", Ollama = "", Text = "󰉿", Method = "󰆧", Function = "󰊕", Constructor = "", Field = "󰜢", Variable = "󰀫", Class = "󰠱", Interface = "", Module = "", Property = "󰜢", Unit = "󰑭", Value = "󰎠", Enum = "", Keyword = "󰌋", Snippet = "", Color = "󰏘", File = "󰈙", Reference = "󰈇", Folder = "󰉋", EnumMember = "", Constant = "󰏿", Struct = "󰙅", Event = "", Operator = "󰆕", Codeium = "", TypeParameter = "󰜅", OpenAI = "", TinyLlama = "󱝊", LlamaCPP = "", } if vim_item.kind == "Color" and entry.completion_item.documentation then local _, _, r, g, b = ---@diagnostic disable-next-line: param-type-mismatch string.find(entry.completion_item.documentation, "^rgb%((%d+), (%d+), (%d+)") if r and g and b then local color = string.format("%02x", r) .. string.format("%02x", g) .. string.format("%02x", b) local group = "Tw_" .. color if vim.api.nvim_call_function("hlID", { group }) < 1 then vim.api.nvim_command("highlight" .. " " .. group .. " " .. "guifg=#" .. color) end vim_item.kind = KIND_ICONS.Tailwind vim_item.kind_hl_group = group return vim_item end end vim_item.kind = KIND_ICONS[vim_item.kind] or vim_item.kind -- Add maxwidth and ellipsis_char in the middle local maxwidth = 50 local ellipsis_char = "..." if #vim_item.abbr > maxwidth then local half_width = math.floor((maxwidth - #ellipsis_char) / 2) vim_item.abbr = string.sub(vim_item.abbr, 1, half_width) .. ellipsis_char .. string.sub(vim_item.abbr, -half_width) end return vim_item end, }, sorting = { priority_weight = 2, comparators = { compare.kind, compare.sort_text, }, }, experimental = { native_menu = false, ghost_text = false, }, } vim.api.nvim_set_hl(0, "CmpItemKindCopilot", { fg = "#3426C3" }) vim.api.nvim_set_hl(0, "CmpItemKindCodeium", { fg = "#2ACDBA" }) vim.api.nvim_set_hl(0, "CmpItemKindOllama", { fg = "#FDFEFF" }) vim.api.nvim_set_hl(0, "CmpItemKindOpenAI", { fg = "#080808" }) vim.api.nvim_set_hl(0, "CmpItemKindTinyLlama", { fg = "#DF468C" }) vim.api.nvim_set_hl(0, "CmpItemKindLlamaCPP", { fg = "#FF8235" }) -- Set configuration for specific filetype. cmp.setup.filetype("gitcommit", { sources = cmp.config.sources({ { name = "cmp_git" }, -- You can specify the `cmp_git` source if you were installed it. }, { { name = "buffer" }, }), }) -- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline("/", { mapping = cmp.mapping.preset.cmdline(), sources = { { name = "buffer" }, }, }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = "path" }, }, { { name = "cmdline" }, }), }) cmp.setup.filetype({ "sql", "mysql", "plsql" }, { sources = cmp.config.sources({ { name = "vim-dadbod-completion" }, }, { { name = "buffer" }, }), })