From fd2cd731dac2eded415198b80ae528a020183f93 Mon Sep 17 00:00:00 2001 From: Price Hiller Date: Mon, 5 Sep 2022 03:46:31 -0500 Subject: [PATCH] feat(nvim): massively improve cmp appearance --- .../config/lua/plugins/configs/_cmp.lua | 306 +++++++++++------- .../primary/config/lua/plugins/plugins.lua | 39 +++ 2 files changed, 223 insertions(+), 122 deletions(-) diff --git a/dots/.nvim-environments/primary/config/lua/plugins/configs/_cmp.lua b/dots/.nvim-environments/primary/config/lua/plugins/configs/_cmp.lua index f7dbf0cf..beaa2809 100755 --- a/dots/.nvim-environments/primary/config/lua/plugins/configs/_cmp.lua +++ b/dots/.nvim-environments/primary/config/lua/plugins/configs/_cmp.lua @@ -1,98 +1,157 @@ -local cmp = require('cmp') -local types = require('cmp.types') -local str = require('cmp.utils.str') +local cmp = require("cmp") +local types = require("cmp.types") +local str = require("cmp.utils.str") local compare = cmp.config.compare -local luasnip = require('luasnip') +local luasnip = require("luasnip") local kind_icons = { - Text = '', - Method = '', - Function = '', - Constructor = '', - Field = '', - Variable = '', - Class = 'ﴯ', - Interface = '', - Module = '', - Property = 'ﰠ', - Unit = '', - Value = '', - Enum = '', - Keyword = '', - Snippet = '', - Color = '', - File = '', - Reference = '', - Folder = '', - EnumMember = '', - Constant = '', - Struct = '', - Event = '', - Operator = '', - TypeParameter = '', + Text = "", + Method = "", + Function = "", + Constructor = "", + Field = "", + Variable = "", + Class = "ﴯ", + Interface = "", + Module = "", + Property = "ﰠ", + Unit = "", + Value = "", + Enum = "", + Keyword = "", + Snippet = "", + Color = "", + File = "", + Reference = "", + Folder = "", + EnumMember = "", + Constant = "", + Struct = "", + Event = "", + Operator = "", + TypeParameter = "", } -- Load Snippets -require('luasnip.loaders.from_vscode').lazy_load() +require("luasnip.loaders.from_vscode").lazy_load() local border = { - { '╭', 'CmpBorder' }, - { '─', 'CmpBorder' }, - { '╮', 'CmpBorder' }, - { '│', 'CmpBorder' }, - { '╯', 'CmpBorder' }, - { '─', 'CmpBorder' }, - { '╰', 'CmpBorder' }, - { '│', 'CmpBorder' }, + { "╭", "CmpBorder" }, + { "─", "CmpBorder" }, + { "╮", "CmpBorder" }, + { "│", "CmpBorder" }, + { "╯", "CmpBorder" }, + { "─", "CmpBorder" }, + { "╰", "CmpBorder" }, + { "│", "CmpBorder" }, } cmp.setup({ + -- formatting = { + -- fields = { + -- cmp.ItemField.Kind, + -- cmp.ItemField.Abbr, + -- cmp.ItemField.Menu, + -- }, + -- format = function(entry, vim_item) + -- -- Get the full snippet (and only keep first line) + -- local word = entry:get_insert_text() + -- if entry.completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet then + -- word = vim.lsp.util.parse_snippet(word) + -- end + -- word = str.oneline(word) + -- + -- -- concatenates the string + -- local max = 50 + -- if string.len(word) >= max then + -- local before = string.sub(word, 1, math.floor((max - 3) / 2)) + -- word = before .. "..." + -- end + -- + -- if + -- entry.completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet + -- and string.sub(vim_item.abbr, -1, -1) == "~" + -- then + -- word = word .. "~" + -- end + -- vim_item.abbr = word + -- -- Kind icons + -- vim_item.kind = string.format("%s %s", kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind + -- + -- return vim_item + -- end, + -- }, formatting = { + fields = { cmp.ItemField.Kind, cmp.ItemField.Abbr, cmp.ItemField.Menu, }, format = function(entry, vim_item) - -- Get the full snippet (and only keep first line) - local word = entry:get_insert_text() - if entry.completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet then - word = vim.lsp.util.parse_snippet(word) - end - word = str.oneline(word) + local selections = { + fuzzy_buffer = { + symbol = "﬘ ", + name = "Buffer", + }, + luasnip = { + symbol = " ", + name = "Snippet", + }, + path = { + symbol = " ", + name = "Path", + }, + calc = { + symbol = " ", + name = "Calculator", + }, + neorg = { + symbol = " ", + name = "Neorg", + }, + emoji = { + symbol = "ﲃ ", + name = "Emoji", + }, + zsh = { + symbol = " ", + name = "Zsh", + }, + crates = { + symbol = " ", + name = "Crates", + }, + cmdline_history = { + symbol = " ", + name = "Cmd History", + }, + rg = { + symbol = " ", + name = "Ripgrep", + }, + npm = { + symbol = " ", + name = "Npm,", + }, + conventionalcommits = { + symbol = " ", + name = "Commit", + }, + } - -- concatenates the string - local max = 50 - if string.len(word) >= max then - local before = string.sub(word, 1, math.floor((max - 3) / 2)) - word = before .. '...' + local selection = selections[entry.source.name] + if not selection then + local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 50 })(entry, vim_item) + local strings = vim.split(kind.kind, "%s", { trimempty = true }) + kind.kind = " " .. strings[1] .. " " + vim_item.menu = strings[1] .. " " .. strings[2] + return kind + else + vim_item.kind = " " .. selection.symbol + vim_item.menu = selection.symbol .. selection.name + return vim_item end - - if entry.completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet - and string.sub(vim_item.abbr, -1, -1) == '~' - then - word = word .. '~' - end - vim_item.abbr = word - -- Kind icons - vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind - -- Source - vim_item.menu = ({ - fuzzy_buffer = '[Buffer]', - nvim_lsp = '[Lsp]', - luasnip = '[LuaSnip]', - path = '[Path]', - calc = '[Calculator]', - neorg = '[Neorg]', - emoji = '[Emoji]', - zsh = '[Zsh]', - crates = '[Crates]', - cmdline_history = '[Cmd History]', - rg = '[Ripgrep]', - npm = '[Npm],', - conventionalcommits = '[Commit]', - })[entry.source.name] - return vim_item end, }, window = { @@ -100,7 +159,10 @@ cmp.setup({ border = border, }, completion = { - border = border, + winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None", + col_offset = -3, + side_padding = 0, + -- border = border, }, }, experimental = { @@ -110,41 +172,41 @@ cmp.setup({ snippet = { -- REQUIRED - you must specify a snippet engine expand = function(args) - require('luasnip').lsp_expand(args.body) -- For `luasnip` users. + require("luasnip").lsp_expand(args.body) -- For `luasnip` users. end, }, mapping = { - [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }), - [''] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }), - [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), - [''] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. - [''] = cmp.mapping({ + [""] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }), + [""] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }), + [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), + [""] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. + [""] = cmp.mapping({ i = cmp.mapping.abort(), c = cmp.mapping.close(), }), - [''] = cmp.mapping.confirm({ select = false }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - [''] = cmp.mapping(function(fallback) + [""] = cmp.mapping.confirm({ select = false }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + [""] = cmp.mapping(function(fallback) if luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end - end, { 'i', 's' }), - [''] = cmp.mapping(function(fallback) + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) if luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end - end, { 'i', 's' }), - [''] = cmp.mapping(function(fallback) + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() else fallback() end - end, { 'i', 's' }), - [''] = cmp.mapping(function(fallback) + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then @@ -152,21 +214,21 @@ cmp.setup({ else fallback() end - end, { 'i', 's' }), + end, { "i", "s" }), }, sources = cmp.config.sources({ - { name = 'nvim_lsp', priority = 10 }, - { name = 'luasnip', priority = 9 }, -- For luasnip users. - { name = 'fuzzy_buffer', priority = 8 }, - { name = 'rg', priority = 7 }, - { name = 'path', priority = 6 }, - { name = 'zsh', priority = 5 }, - { name = 'emoji', keyword_length = 2 }, - { name = 'neorg' }, - { name = 'calc' }, - { name = 'npm', keyword_length = 2 }, + { name = "nvim_lsp", priority = 10 }, + { name = "luasnip", priority = 9 }, -- For luasnip users. + { name = "fuzzy_buffer", priority = 8 }, + { name = "rg", priority = 7 }, + { name = "path", priority = 6 }, + { name = "zsh", priority = 5 }, + { name = "emoji", keyword_length = 2 }, + { name = "neorg" }, + { name = "calc" }, + { name = "npm", keyword_length = 2 }, { - name = 'dictionary', + name = "dictionary", keyword_length = 2, }, }), @@ -176,7 +238,7 @@ cmp.setup({ compare.offset, compare.recently_used, compare.exact, - require('cmp_fuzzy_buffer.compare'), + require("cmp_fuzzy_buffer.compare"), compare.kind, compare.sort_text, compare.length, @@ -186,55 +248,55 @@ cmp.setup({ }) -- Git Commit Completions -cmp.setup.filetype('gitcommit', { +cmp.setup.filetype("gitcommit", { sources = cmp.config.sources({ - { name = 'conventionalcommits', priority = 20 }, + { name = "conventionalcommits", priority = 20 }, }), }) -cmp.setup.filetype('NeogitCommitMesssage', { +cmp.setup.filetype("NeogitCommitMesssage", { sources = cmp.config.sources({ - { name = 'conventionalcommits', priority = 20 }, + { name = "conventionalcommits", priority = 20 }, }), }) -cmp.setup.filetype('toml', { +cmp.setup.filetype("toml", { sources = cmp.config.sources({ - { name = 'crates' }, + { name = "crates" }, }), }) -- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore). -cmp.setup.cmdline('/', { +cmp.setup.cmdline("/", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ - { name = 'fuzzy_buffer' }, - { name = 'cmdline_history' }, + { name = "fuzzy_buffer" }, + { name = "cmdline_history" }, }), }) -cmp.setup.cmdline('?', { +cmp.setup.cmdline("?", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ - { name = 'fuzzy_buffer' }, - { name = 'cmdline_history' }, + { name = "fuzzy_buffer" }, + { name = "cmdline_history" }, }), }) -cmp.setup.cmdline('@', { +cmp.setup.cmdline("@", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ - { name = 'fuzzy_buffer' }, - { name = 'cmdline_history' }, + { name = "fuzzy_buffer" }, + { name = "cmdline_history" }, }), }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). -cmp.setup.cmdline(':', { +cmp.setup.cmdline(":", { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ - { name = 'path' }, - { name = 'cmdline' }, - { name = 'cmdline_history' }, + { name = "path" }, + { name = "cmdline" }, + { name = "cmdline_history" }, }), }) diff --git a/dots/.nvim-environments/primary/config/lua/plugins/plugins.lua b/dots/.nvim-environments/primary/config/lua/plugins/plugins.lua index 12e56df1..0cb9a80d 100755 --- a/dots/.nvim-environments/primary/config/lua/plugins/plugins.lua +++ b/dots/.nvim-environments/primary/config/lua/plugins/plugins.lua @@ -82,6 +82,44 @@ return packer.startup({ NeogitDiffDeleteHighlight = { fg = colors.git.removed, bg = colors.diff.delete }, NeogitDiffAddHighlight = { fg = colors.git.added, bg = colors.diff.add }, NeogitCommitViewHeader = { fg = colors.git.changed, bg = colors.diff.text }, + menuSel = { bg = "#282C34", fg = "NONE" }, + Pmenu = { fg = "#C5CDD9", bg = "#22252A" }, + CmpItemAbbrDeprecated = { fg = "#7E8294", bg = "NONE" }, + CmpItemAbbrMatch = { fg = "#82AAFF", bg = "NONE" }, + CmpItemAbbrMatchFuzzy = { fg = "#82AAFF", bg = "NONE" }, + CmpItemMenu = { fg = "#C792EA", bg = "NONE" }, + CmpItemKindField = { fg = "#EED8DA", bg = "#B5585F" }, + CmpItemKindProperty = { fg = "#EED8DA", bg = "#B5585F" }, + CmpItemKindEvent = { fg = "#EED8DA", bg = "#B5585F" }, + + CmpItemKindText = { fg = "#C3E88D", bg = "#9FBD73" }, + CmpItemKindEnum = { fg = "#C3E88D", bg = "#9FBD73" }, + CmpItemKindKeyword = { fg = "#C3E88D", bg = "#9FBD73" }, + + CmpItemKindConstant = { fg = "#FFE082", bg = "#D4BB6C" }, + CmpItemKindConstructor = { fg = "#FFE082", bg = "#D4BB6C" }, + CmpItemKindReference = { fg = "#FFE082", bg = "#D4BB6C" }, + + CmpItemKindFunction = { fg = "#EADFF0", bg = "#A377BF" }, + CmpItemKindStruct = { fg = "#EADFF0", bg = "#A377BF" }, + CmpItemKindClass = { fg = "#EADFF0", bg = "#A377BF" }, + CmpItemKindModule = { fg = "#EADFF0", bg = "#A377BF" }, + CmpItemKindOperator = { fg = "#EADFF0", bg = "#A377BF" }, + + CmpItemKindVariable = { fg = "#C5CDD9", bg = "#7E8294" }, + CmpItemKindFile = { fg = "#C5CDD9", bg = "#7E8294" }, + + CmpItemKindUnit = { fg = "#F5EBD9", bg = "#D4A959" }, + CmpItemKindSnippet = { fg = "#F5EBD9", bg = "#D4A959" }, + CmpItemKindFolder = { fg = "#F5EBD9", bg = "#D4A959" }, + + CmpItemKindMethod = { fg = "#DDE5F5", bg = "#6C8ED4" }, + CmpItemKindValue = { fg = "#DDE5F5", bg = "#6C8ED4" }, + CmpItemKindEnumMember = { fg = "#DDE5F5", bg = "#6C8ED4" }, + + CmpItemKindInterface = { fg = "#D8EEEB", bg = "#58B5A8" }, + CmpItemKindColor = { fg = "#D8EEEB", bg = "#58B5A8" }, + CmpItemKindTypeParameter = { fg = "#D8EEEB", bg = "#58B5A8" }, WinSeparator = { fg = "#54546D", bg = "NONE" }, }, }) @@ -381,6 +419,7 @@ return packer.startup({ "dmitmel/cmp-cmdline-history", "David-Kunz/cmp-npm", "lukas-reineke/cmp-rg", + "onsails/lspkind.nvim", }, config = function() require("plugins.configs._cmp")