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-path', --path completions
'hrsh7th/cmp-cmdline', --cmdline completions
'saadparwaiz1/cmp_luasnip',
'L3MON4D3/LuaSnip',
'onsails/lspkind.nvim',
},
config = function()
local cmp_status_ok, cmp = pcall(require, "cmp")
@ -21,6 +23,18 @@ return {
return
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()
local check_backspace = function()
@ -28,35 +42,6 @@ return {
return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
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 {
snippet = {
expand = function(args)
@ -64,16 +49,19 @@ return {
end,
},
mapping = {
["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }),
["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }),
["<C-n>"] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Insert },
["<C-p>"] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Insert },
["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }),
["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }),
["<C-e>"] = cmp.mapping.abort(),
["<C-y>"] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Insert,
select = true
},
{ "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(),
},
-- Accept currently selected item. If none selected, do nothing.
["<CR>"] = cmp.mapping.confirm { select = false },
["<C-k>"] = cmp.mapping(function(fallback)
if luasnip.expandable() then
luasnip.expand()
@ -93,96 +81,91 @@ return {
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 = {
fields = { "kind", "abbr", "menu" },
format = function(entry, vim_item)
-- Kind icons
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 = ({
nvim_lsp = "(LSP)",
luasnip = "(Snippet)",
buffer = "(Text)",
nvim_lsp_signature_help = "(Signature)",
nvim_lua = "(Nvim LSP)",
path = "(Path)",
})[entry.source.name]
return vim_item
end,
-- fields = { "kind", "abbr", "menu" },
format = lspkind.cmp_format {
with_text = true,
menu = {
buffer = "[buf]",
nvim_lsp = "[lsp]",
luasnip = "[snip]",
nvim_lsp_signature_help = "[sig]",
nvim_lua = "[lua]",
path = "[path]",
},
},
-- format = function(entry, vim_item)
-- -- Kind icons
-- 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(
{
{
name = "nvim_lsp",
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 = "nvim_lsp", },
{ name = 'nvim_lua' },
{ name = 'luasnip' },
{ name = 'nvim_lsp_signature_help' },
{ name = 'path' },
--{ name = 'nvim_lsp_signature_help' },
{ name = 'orgmode' }
},
{
--This sources will only show up if there aren't any sources from the other list
{ name = 'path' },
{ name = "buffer", keyword_length = 5 },
}
),
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"
})
sorting = {
comparators = {
cmp.config.compare.offset,
cmp.config.compare.exact,
cmp.config.compare.score,
-- 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,
},