better cmp

This commit is contained in:
Tiago Sousa 2024-02-03 00:10:19 +00:00
parent 1e373444d6
commit 89d607adfd

View file

@ -8,7 +8,9 @@ return {
'hrsh7th/cmp-buffer', --buffer completions 'hrsh7th/cmp-buffer', --buffer completions
'hrsh7th/cmp-path', --path completions 'hrsh7th/cmp-path', --path completions
'hrsh7th/cmp-cmdline', --cmdline completions 'hrsh7th/cmp-cmdline', --cmdline completions
'saadparwaiz1/cmp_luasnip',
'L3MON4D3/LuaSnip', 'L3MON4D3/LuaSnip',
'onsails/lspkind.nvim',
}, },
config = function() config = function()
local cmp_status_ok, cmp = pcall(require, "cmp") local cmp_status_ok, cmp = pcall(require, "cmp")
@ -21,6 +23,18 @@ return {
return return
end end
local ok, lspkind = pcall(require, "lspkind")
if not ok then
return
end
lspkind.init {
symbol_map = {
Copilot = "",
},
}
vim.api.nvim_set_hl(0, "CmpItemKindCopilot", { fg = "#6CC644" })
require("luasnip/loaders/from_vscode").lazy_load() require("luasnip/loaders/from_vscode").lazy_load()
local check_backspace = function() local check_backspace = function()
@ -28,35 +42,6 @@ return {
return col == 0 or vim.fn.getline("."):sub(col, col):match "%s" return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
end end
-- 󰃐 󰆩 󰙅 󰛡  󰅲 some other good icons
local kind_icons = {
Text = "󰉿",
Method = "m",
Function = "󰊕",
Constructor = "",
Field = "",
Variable = "󰆧",
Class = "󰌗",
Interface = "",
Module = "",
Property = "",
Unit = "",
Value = "󰎠",
Enum = "",
Keyword = "󰌋",
Snippet = "",
Color = "󰏘",
File = "󰈙",
Reference = "",
Folder = "󰉋",
EnumMember = "",
Constant = "󰇽",
Struct = "",
Event = "",
Operator = "󰆕",
TypeParameter = "󰊄",
}
cmp.setup { cmp.setup {
snippet = { snippet = {
expand = function(args) expand = function(args)
@ -64,16 +49,19 @@ return {
end, end,
}, },
mapping = { mapping = {
["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }), ["<C-n>"] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Insert },
["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }), ["<C-p>"] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Insert },
["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), ["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }),
["<C-y>"] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping. ["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }),
["<C-e>"] = cmp.mapping { ["<C-e>"] = cmp.mapping.abort(),
i = cmp.mapping.abort(), ["<C-y>"] = cmp.mapping.confirm({
c = cmp.mapping.close(), behavior = cmp.ConfirmBehavior.Insert,
select = true
}, },
-- Accept currently selected item. If none selected, do nothing. { "i", "c" }
["<CR>"] = cmp.mapping.confirm { select = false }, ),
["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
["<C-k>"] = cmp.mapping(function(fallback) ["<C-k>"] = cmp.mapping(function(fallback)
if luasnip.expandable() then if luasnip.expandable() then
luasnip.expand() luasnip.expand()
@ -93,96 +81,91 @@ return {
end end
end end
), ),
["<C-n>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end, {
"i",
"s",
}),
["<C-p>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
else
fallback()
end
end, {
"i",
"s",
}),
}, },
formatting = { formatting = {
fields = { "kind", "abbr", "menu" }, -- fields = { "kind", "abbr", "menu" },
format = function(entry, vim_item) format = lspkind.cmp_format {
-- Kind icons with_text = true,
vim_item.kind = string.format("%s", kind_icons[vim_item.kind]) menu = {
-- 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 buffer = "[buf]",
vim_item.menu = ({ nvim_lsp = "[lsp]",
nvim_lsp = "(LSP)", luasnip = "[snip]",
luasnip = "(Snippet)", nvim_lsp_signature_help = "[sig]",
buffer = "(Text)", nvim_lua = "[lua]",
nvim_lsp_signature_help = "(Signature)", path = "[path]",
nvim_lua = "(Nvim LSP)", },
path = "(Path)", },
})[entry.source.name] -- format = function(entry, vim_item)
return vim_item -- -- Kind icons
end, -- vim_item.kind = string.format("%s", kind_icons[vim_item.kind])
-- -- 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
-- vim_item.menu = ({
-- buffer = "[buf]",
-- nvim_lsp = "[LSP]",
-- luasnip = "[snip]",
-- nvim_lsp_signature_help = "[Signature]",
-- nvim_lua = "[lua]",
-- path = "[path]",
-- })[entry.source.name]
-- return vim_item
-- end,
}, },
sources = cmp.config.sources( sources = cmp.config.sources(
{ {
{ { name = "nvim_lsp", },
name = "nvim_lsp", { name = 'nvim_lua' },
entry_filter = function(entry, context)
local kind = entry:get_kind()
local line = context.cursor_line
local col = context.cursor.col
local char_before_cursor = string.sub(line, col - 1, col - 1)
if char_before_cursor == "." then
if kind == 2 or kind == 5 then
return true
else
return false
end
elseif string.match(line, "^%s*%w*$") then
if kind == 3 or kind == 6 then
return true
else
return false
end
end
return true
end
},
--{ name = 'nvim_lua' },
{ name = 'luasnip' }, { name = 'luasnip' },
{ name = 'nvim_lsp_signature_help' }, --{ name = 'nvim_lsp_signature_help' },
{ name = 'path' },
{ name = 'orgmode' } { name = 'orgmode' }
}, },
{ {
--This sources will only show up if there aren't any sources from the other list --This sources will only show up if there aren't any sources from the other list
{ name = 'path' },
{ name = "buffer", keyword_length = 5 }, { name = "buffer", keyword_length = 5 },
} }
), ),
confirm_opts = { sorting = {
behavior = cmp.ConfirmBehavior.Replace, comparators = {
select = false, cmp.config.compare.offset,
}, cmp.config.compare.exact,
window = { cmp.config.compare.score,
documentation = cmp.config.window.bordered(),
completion = cmp.config.window.bordered({
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None"
})
-- copied from cmp-under, but I don't think I need the plugin for this.
-- I might add some more of my own.
function(entry1, entry2)
local _, entry1_under = entry1.completion_item.label:find "^_+"
local _, entry2_under = entry2.completion_item.label:find "^_+"
entry1_under = entry1_under or 0
entry2_under = entry2_under or 0
if entry1_under > entry2_under then
return false
elseif entry1_under < entry2_under then
return true
end
end,
cmp.config.compare.kind,
cmp.config.compare.sort_text,
cmp.config.compare.length,
cmp.config.compare.order,
}, },
--experimental = { },
-- ghost_text = true,
-- native_menu = false, --confirm_opts = {
-- behavior = cmp.ConfirmBehavior.Replace,
-- select = false,
--}, --},
-- window = {
-- documentation = cmp.config.window.bordered(),
-- completion = cmp.config.window.bordered({
-- winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None"
-- })
-- },
experimental = {
ghost_text = false,
native_menu = false,
},
} }
end, end,
}, },