diff --git a/.config/nvim/lua/tsousa/plugins/lsp.lua b/.config/nvim/lua/tsousa/plugins/lsp.lua index bc3142c..231929c 100644 --- a/.config/nvim/lua/tsousa/plugins/lsp.lua +++ b/.config/nvim/lua/tsousa/plugins/lsp.lua @@ -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 = { - [""] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }), - [""] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }), + [""] = cmp.mapping.select_next_item { behavior = cmp.SelectBehavior.Insert }, + [""] = cmp.mapping.select_prev_item { behavior = cmp.SelectBehavior.Insert }, + [""] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }), + [""] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }), + [""] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Insert, + select = true + }, + { "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(), - }, - -- Accept currently selected item. If none selected, do nothing. - [""] = cmp.mapping.confirm { select = false }, + [""] = cmp.mapping(function(fallback) if luasnip.expandable() then luasnip.expand() @@ -93,96 +81,91 @@ return { end end ), - [""] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - else - fallback() - end - end, { - "i", - "s", - }), - [""] = 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, },