feat(nvim): massively improve cmp appearance

This commit is contained in:
Price Hiller 2022-09-05 03:46:31 -05:00
parent 1930ebd315
commit fd2cd731da
2 changed files with 223 additions and 122 deletions

View File

@ -1,98 +1,157 @@
local cmp = require('cmp') local cmp = require("cmp")
local types = require('cmp.types') local types = require("cmp.types")
local str = require('cmp.utils.str') local str = require("cmp.utils.str")
local compare = cmp.config.compare local compare = cmp.config.compare
local luasnip = require('luasnip') local luasnip = require("luasnip")
local kind_icons = { local kind_icons = {
Text = '', Text = "",
Method = '', Method = "",
Function = '', Function = "",
Constructor = '', Constructor = "",
Field = '', Field = "",
Variable = '', Variable = "",
Class = '', Class = "",
Interface = '', Interface = "",
Module = '', Module = "",
Property = '', Property = "",
Unit = '', Unit = "",
Value = '', Value = "",
Enum = '', Enum = "",
Keyword = '', Keyword = "",
Snippet = '', Snippet = "",
Color = '', Color = "",
File = '', File = "",
Reference = '', Reference = "",
Folder = '', Folder = "",
EnumMember = '', EnumMember = "",
Constant = '', Constant = "",
Struct = '', Struct = "",
Event = '', Event = "",
Operator = '', Operator = "",
TypeParameter = '', TypeParameter = "",
} }
-- Load Snippets -- Load Snippets
require('luasnip.loaders.from_vscode').lazy_load() require("luasnip.loaders.from_vscode").lazy_load()
local border = { local border = {
{ '', 'CmpBorder' }, { "", "CmpBorder" },
{ '', 'CmpBorder' }, { "", "CmpBorder" },
{ '', 'CmpBorder' }, { "", "CmpBorder" },
{ '', 'CmpBorder' }, { "", "CmpBorder" },
{ '', 'CmpBorder' }, { "", "CmpBorder" },
{ '', 'CmpBorder' }, { "", "CmpBorder" },
{ '', 'CmpBorder' }, { "", "CmpBorder" },
{ '', 'CmpBorder' }, { "", "CmpBorder" },
} }
cmp.setup({ 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 = { formatting = {
fields = { fields = {
cmp.ItemField.Kind, cmp.ItemField.Kind,
cmp.ItemField.Abbr, cmp.ItemField.Abbr,
cmp.ItemField.Menu, cmp.ItemField.Menu,
}, },
format = function(entry, vim_item) format = function(entry, vim_item)
-- Get the full snippet (and only keep first line) local selections = {
local word = entry:get_insert_text() fuzzy_buffer = {
if entry.completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet then symbol = "",
word = vim.lsp.util.parse_snippet(word) name = "Buffer",
end },
word = str.oneline(word) 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 selection = selections[entry.source.name]
local max = 50 if not selection then
if string.len(word) >= max then local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 50 })(entry, vim_item)
local before = string.sub(word, 1, math.floor((max - 3) / 2)) local strings = vim.split(kind.kind, "%s", { trimempty = true })
word = before .. '...' 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 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, end,
}, },
window = { window = {
@ -100,7 +159,10 @@ cmp.setup({
border = border, border = border,
}, },
completion = { completion = {
border = border, winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None",
col_offset = -3,
side_padding = 0,
-- border = border,
}, },
}, },
experimental = { experimental = {
@ -110,41 +172,41 @@ cmp.setup({
snippet = { snippet = {
-- REQUIRED - you must specify a snippet engine -- REQUIRED - you must specify a snippet engine
expand = function(args) expand = function(args)
require('luasnip').lsp_expand(args.body) -- For `luasnip` users. require("luasnip").lsp_expand(args.body) -- For `luasnip` users.
end, end,
}, },
mapping = { mapping = {
['<C-b>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }), ["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }),
['<C-f>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }), ["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }),
['<C-Space>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), ["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
['<C-y>'] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping. ["<C-y>"] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
['<C-e>'] = cmp.mapping({ ["<C-e>"] = cmp.mapping({
i = cmp.mapping.abort(), i = cmp.mapping.abort(),
c = cmp.mapping.close(), c = cmp.mapping.close(),
}), }),
['<CR>'] = cmp.mapping.confirm({ select = false }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. ["<CR>"] = cmp.mapping.confirm({ select = false }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
['<C-Tab>'] = cmp.mapping(function(fallback) ["<C-Tab>"] = cmp.mapping(function(fallback)
if luasnip.expand_or_jumpable() then if luasnip.expand_or_jumpable() then
luasnip.expand_or_jump() luasnip.expand_or_jump()
else else
fallback() fallback()
end end
end, { 'i', 's' }), end, { "i", "s" }),
['<C-S-Tab>'] = cmp.mapping(function(fallback) ["<C-S-Tab>"] = cmp.mapping(function(fallback)
if luasnip.jumpable(-1) then if luasnip.jumpable(-1) then
luasnip.jump(-1) luasnip.jump(-1)
else else
fallback() fallback()
end end
end, { 'i', 's' }), end, { "i", "s" }),
['<Tab>'] = cmp.mapping(function(fallback) ["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then if cmp.visible() then
cmp.select_next_item() cmp.select_next_item()
else else
fallback() fallback()
end end
end, { 'i', 's' }), end, { "i", "s" }),
['<S-Tab>'] = cmp.mapping(function(fallback) ["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then if cmp.visible() then
cmp.select_prev_item() cmp.select_prev_item()
elseif luasnip.jumpable(-1) then elseif luasnip.jumpable(-1) then
@ -152,21 +214,21 @@ cmp.setup({
else else
fallback() fallback()
end end
end, { 'i', 's' }), end, { "i", "s" }),
}, },
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'nvim_lsp', priority = 10 }, { name = "nvim_lsp", priority = 10 },
{ name = 'luasnip', priority = 9 }, -- For luasnip users. { name = "luasnip", priority = 9 }, -- For luasnip users.
{ name = 'fuzzy_buffer', priority = 8 }, { name = "fuzzy_buffer", priority = 8 },
{ name = 'rg', priority = 7 }, { name = "rg", priority = 7 },
{ name = 'path', priority = 6 }, { name = "path", priority = 6 },
{ name = 'zsh', priority = 5 }, { name = "zsh", priority = 5 },
{ name = 'emoji', keyword_length = 2 }, { name = "emoji", keyword_length = 2 },
{ name = 'neorg' }, { name = "neorg" },
{ name = 'calc' }, { name = "calc" },
{ name = 'npm', keyword_length = 2 }, { name = "npm", keyword_length = 2 },
{ {
name = 'dictionary', name = "dictionary",
keyword_length = 2, keyword_length = 2,
}, },
}), }),
@ -176,7 +238,7 @@ cmp.setup({
compare.offset, compare.offset,
compare.recently_used, compare.recently_used,
compare.exact, compare.exact,
require('cmp_fuzzy_buffer.compare'), require("cmp_fuzzy_buffer.compare"),
compare.kind, compare.kind,
compare.sort_text, compare.sort_text,
compare.length, compare.length,
@ -186,55 +248,55 @@ cmp.setup({
}) })
-- Git Commit Completions -- Git Commit Completions
cmp.setup.filetype('gitcommit', { cmp.setup.filetype("gitcommit", {
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'conventionalcommits', priority = 20 }, { name = "conventionalcommits", priority = 20 },
}), }),
}) })
cmp.setup.filetype('NeogitCommitMesssage', { cmp.setup.filetype("NeogitCommitMesssage", {
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'conventionalcommits', priority = 20 }, { name = "conventionalcommits", priority = 20 },
}), }),
}) })
cmp.setup.filetype('toml', { cmp.setup.filetype("toml", {
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'crates' }, { name = "crates" },
}), }),
}) })
-- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore). -- 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(), mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'fuzzy_buffer' }, { name = "fuzzy_buffer" },
{ name = 'cmdline_history' }, { name = "cmdline_history" },
}), }),
}) })
cmp.setup.cmdline('?', { cmp.setup.cmdline("?", {
mapping = cmp.mapping.preset.cmdline(), mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'fuzzy_buffer' }, { name = "fuzzy_buffer" },
{ name = 'cmdline_history' }, { name = "cmdline_history" },
}), }),
}) })
cmp.setup.cmdline('@', { cmp.setup.cmdline("@", {
mapping = cmp.mapping.preset.cmdline(), mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'fuzzy_buffer' }, { name = "fuzzy_buffer" },
{ name = 'cmdline_history' }, { name = "cmdline_history" },
}), }),
}) })
-- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). -- 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(), mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'path' }, { name = "path" },
{ name = 'cmdline' }, { name = "cmdline" },
{ name = 'cmdline_history' }, { name = "cmdline_history" },
}), }),
}) })

View File

@ -82,6 +82,44 @@ return packer.startup({
NeogitDiffDeleteHighlight = { fg = colors.git.removed, bg = colors.diff.delete }, NeogitDiffDeleteHighlight = { fg = colors.git.removed, bg = colors.diff.delete },
NeogitDiffAddHighlight = { fg = colors.git.added, bg = colors.diff.add }, NeogitDiffAddHighlight = { fg = colors.git.added, bg = colors.diff.add },
NeogitCommitViewHeader = { fg = colors.git.changed, bg = colors.diff.text }, 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" }, WinSeparator = { fg = "#54546D", bg = "NONE" },
}, },
}) })
@ -381,6 +419,7 @@ return packer.startup({
"dmitmel/cmp-cmdline-history", "dmitmel/cmp-cmdline-history",
"David-Kunz/cmp-npm", "David-Kunz/cmp-npm",
"lukas-reineke/cmp-rg", "lukas-reineke/cmp-rg",
"onsails/lspkind.nvim",
}, },
config = function() config = function()
require("plugins.configs._cmp") require("plugins.configs._cmp")