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 = { 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) if vim.api.nvim_buf_get_option(bufnr, "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 vim_item.menu = entry.completion_item.menu 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 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" }, }), })