diff options
author | kylo252 <[email protected]> | 2022-10-17 17:29:15 +0200 |
---|---|---|
committer | kylo252 <[email protected]> | 2022-10-17 17:29:15 +0200 |
commit | 4ef07315003f723bb8e97d5a91b2bde3773ec1b8 (patch) | |
tree | e9889a492f76e3f9573228343aaba647dfd48136 /lua/lvim/core/cmp.lua | |
parent | e4a5fe97abe500bbbe78fb137d57a59f558da05a (diff) | |
parent | 6f6cbc394d2a7e64964b6067a2f42d2e6a07824e (diff) |
Merge remote-tracking branch 'origin/rolling'
Diffstat (limited to 'lua/lvim/core/cmp.lua')
-rw-r--r-- | lua/lvim/core/cmp.lua | 147 |
1 files changed, 113 insertions, 34 deletions
diff --git a/lua/lvim/core/cmp.lua b/lua/lvim/core/cmp.lua index 408691a6..4ebc4d43 100644 --- a/lua/lvim/core/cmp.lua +++ b/lua/lvim/core/cmp.lua @@ -19,6 +19,7 @@ end local function feedkeys(key, mode) vim.api.nvim_feedkeys(T(key), mode, true) end + M.methods.feedkeys = feedkeys ---when inside a snippet, seeks to the nearest luasnip field if possible, and checks if it is jumpable @@ -113,6 +114,7 @@ local function jumpable(dir) return luasnip.in_snippet() and seek_luasnip_cursor_node() and luasnip.jumpable(1) end end + M.methods.jumpable = jumpable M.config = function() @@ -135,39 +137,13 @@ M.config = function() keyword_length = 1, }, experimental = { - ghost_text = true, + ghost_text = false, native_menu = false, }, formatting = { fields = { "kind", "abbr", "menu" }, max_width = 0, - kind_icons = { - Class = "ī ", - Color = "îĢ ", - Constant = "ī˛ ", - Constructor = "īĨ ", - Enum = "īŠ", - EnumMember = "ī
", - Event = "ī§ ", - Field = "î ", - File = "ī", - Folder = "ī ", - Function = "ī ", - Interface = "ī°Ž ", - Keyword = "ī ", - Method = "î ", - Module = "ī¨ ", - Operator = "ī", - Property = "î¤ ", - Reference = "ī ", - Snippet = "ī ", - Struct = "ī ", - Text = "īž ", - TypeParameter = "ī ", - Unit = "īĨŦ", - Value = "īĸ ", - Variable = "īĻ ", - }, + kind_icons = lvim.icons.kind, source_names = { nvim_lsp = "(LSP)", emoji = "(Emoji)", @@ -178,6 +154,8 @@ M.config = function() luasnip = "(Snippet)", buffer = "(Buffer)", tmux = "(TMUX)", + copilot = "(Copilot)", + treesitter = "(TreeSitter)", }, duplicates = { buffer = 1, @@ -189,10 +167,40 @@ M.config = function() format = function(entry, vim_item) local max_width = lvim.builtin.cmp.formatting.max_width if max_width ~= 0 and #vim_item.abbr > max_width then - vim_item.abbr = string.sub(vim_item.abbr, 1, max_width - 1) .. "âĻ" + vim_item.abbr = string.sub(vim_item.abbr, 1, max_width - 1) .. lvim.icons.ui.Ellipsis end if lvim.use_icons then vim_item.kind = lvim.builtin.cmp.formatting.kind_icons[vim_item.kind] + + -- TODO: not sure why I can't put this anywhere else + vim.api.nvim_set_hl(0, "CmpItemKindCopilot", { fg = "#6CC644" }) + if entry.source.name == "copilot" then + vim_item.kind = lvim.icons.git.Octoface + vim_item.kind_hl_group = "CmpItemKindCopilot" + end + + vim.api.nvim_set_hl(0, "CmpItemKindTabnine", { fg = "#CA42F0" }) + if entry.source.name == "cmp_tabnine" then + vim_item.kind = lvim.icons.misc.Robot + vim_item.kind_hl_group = "CmpItemKindTabnine" + end + + vim.api.nvim_set_hl(0, "CmpItemKindCrate", { fg = "#F64D00" }) + if entry.source.name == "crates" then + vim_item.kind = lvim.icons.misc.Package + vim_item.kind_hl_group = "CmpItemKindCrate" + end + + if entry.source.name == "lab.quick_data" then + vim_item.kind = lvim.icons.misc.CircuitBoard + vim_item.kind_hl_group = "CmpItemKindConstant" + end + + vim.api.nvim_set_hl(0, "CmpItemKindEmoji", { fg = "#FDE030" }) + if entry.source.name == "emoji" then + vim_item.kind = lvim.icons.misc.Smiley + vim_item.kind_hl_group = "CmpItemKindEmoji" + end end vim_item.menu = lvim.builtin.cmp.formatting.source_names[entry.source.name] vim_item.dup = lvim.builtin.cmp.formatting.duplicates[entry.source.name] @@ -210,7 +218,50 @@ M.config = function() documentation = cmp.config.window.bordered(), }, sources = { - { name = "nvim_lsp" }, + { + name = "copilot", + -- keyword_length = 0, + max_item_count = 3, + trigger_characters = { + { + ".", + ":", + "(", + "'", + '"', + "[", + ",", + "#", + "*", + "@", + "|", + "=", + "-", + "{", + "/", + "\\", + "+", + "?", + " ", + -- "\t", + -- "\n", + }, + }, + }, + { + name = "nvim_lsp", + entry_filter = function(entry, ctx) + local kind = require("cmp.types").lsp.CompletionItemKind[entry:get_kind()] + if kind == "Snippet" and ctx.prev_context.filetype == "java" then + return false + end + if kind == "Text" then + return false + end + return true + end, + }, + { name = "path" }, { name = "luasnip" }, { name = "cmp_tabnine" }, @@ -223,8 +274,8 @@ M.config = function() { name = "tmux" }, }, mapping = cmp.mapping.preset.insert { - ["<C-k>"] = cmp.mapping.select_prev_item(), - ["<C-j>"] = cmp.mapping.select_next_item(), + ["<C-k>"] = cmp.mapping(cmp.mapping.select_prev_item(), { "i", "c" }), + ["<C-j>"] = cmp.mapping(cmp.mapping.select_next_item(), { "i", "c" }), ["<Down>"] = cmp.mapping(cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Select }, { "i" }), ["<Up>"] = cmp.mapping(cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Select }, { "i" }), ["<C-d>"] = cmp.mapping.scroll_docs(-4), @@ -247,7 +298,8 @@ M.config = function() elseif jumpable(1) then luasnip.jump(1) elseif has_words_before() then - cmp.complete() + -- cmp.complete() + fallback() else fallback() end @@ -283,11 +335,38 @@ M.config = function() fallback() -- if not exited early, always fallback end), }, + cmdline = { + enable = true, + options = { + { + type = ":", + sources = { + { name = "path" }, + }, + }, + { + type = { "/", "?" }, + sources = { + { name = "buffer" }, + }, + }, + }, + }, } end function M.setup() - require("cmp").setup(lvim.builtin.cmp) + local cmp = require "cmp" + cmp.setup(lvim.builtin.cmp) + + if lvim.builtin.cmp.cmdline.enable then + for _, option in ipairs(lvim.builtin.cmp.cmdline.options) do + cmp.setup.cmdline(option.type, { + mapping = cmp.mapping.preset.cmdline(), + sources = option.sources, + }) + end + end end return M |