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 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 = {
['<C-b>'] = 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-y>'] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
['<C-e>'] = cmp.mapping({
["<C-b>"] = 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-y>"] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
["<C-e>"] = cmp.mapping({
i = cmp.mapping.abort(),
c = cmp.mapping.close(),
}),
['<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)
["<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)
if luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { 'i', 's' }),
['<C-S-Tab>'] = cmp.mapping(function(fallback)
end, { "i", "s" }),
["<C-S-Tab>"] = cmp.mapping(function(fallback)
if luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { 'i', 's' }),
['<Tab>'] = cmp.mapping(function(fallback)
end, { "i", "s" }),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
end, { "i", "s" }),
["<S-Tab>"] = 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" },
}),
})

View File

@ -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")