From 0005b934d595f71ee2cc3b3ab54833a3383e07e4 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Fri, 18 Apr 2025 16:56:48 +0200 Subject: [PATCH] feat(home-manager): replace cmp neovim plugin by blink.cmp --- modules/home-manager/cli/neovim/default.nix | 12 +-- .../cli/neovim/files/plugins/blink-cmp.lua | 99 +++++++++++++++++++ .../cli/neovim/files/plugins/cmp.lua | 98 ------------------ 3 files changed, 103 insertions(+), 106 deletions(-) create mode 100644 modules/home-manager/cli/neovim/files/plugins/blink-cmp.lua delete mode 100644 modules/home-manager/cli/neovim/files/plugins/cmp.lua diff --git a/modules/home-manager/cli/neovim/default.nix b/modules/home-manager/cli/neovim/default.nix index 30763f3..507e21f 100644 --- a/modules/home-manager/cli/neovim/default.nix +++ b/modules/home-manager/cli/neovim/default.nix @@ -84,15 +84,12 @@ in config = (builtins.readFile ./files/plugins/theme.lua); } { - plugin = nvim-cmp; + plugin = blink-cmp; type = "lua"; - config = (builtins.readFile ./files/plugins/cmp.lua); + config = (builtins.readFile ./files/plugins/blink-cmp.lua); } - cmp-buffer - cmp-nvim-lsp - cmp-path - cmp-cmdline - cmp_luasnip + blink-emoji-nvim + blink-cmp-dictionary { plugin = conform-nvim; type = "lua"; @@ -122,7 +119,6 @@ in type = "lua"; config = (builtins.readFile ./files/plugins/lualine.lua); } - luasnip { plugin = neo-tree-nvim; type = "lua"; diff --git a/modules/home-manager/cli/neovim/files/plugins/blink-cmp.lua b/modules/home-manager/cli/neovim/files/plugins/blink-cmp.lua new file mode 100644 index 0000000..1d42f63 --- /dev/null +++ b/modules/home-manager/cli/neovim/files/plugins/blink-cmp.lua @@ -0,0 +1,99 @@ +require("blink.cmp").setup({ + keymap = { + preset = "cmdline", + [''] = { 'scroll_documentation_up', 'fallback' }, + [''] = { 'scroll_documentation_down', 'fallback' }, + }, + completion = { + menu = { + draw = { + components = { + label = { + width = { fill = true, max = 60, }, + }, + }, + columns = { { "label", "label_description", gap = 1 }, { "kind_icon", "kind" } }, + }, + }, + documentation = { auto_show = true }, + list = { + max_items = 30; + selection = { + preselect = false, + auto_insert = true, + }, + cycle = { + from_bottom = true, + from_top = true, + }, + }, + }, + sources = { + default = { + "lsp", + "path", + "snippets", + "buffer", + "emoji", + "dictionary", + }, + providers = { + emoji = { + module = "blink-emoji", + name = "Emoji", + score_offset = 15, -- Tune by preference + opts = { insert = true }, -- Insert emoji (default) or complete its name + should_show_items = function() + return vim.tbl_contains({ "gitcommit", "markdown" }, vim.o.filetype) + end, + }, + dictionary = { + module = "blink-cmp-dictionary", + name = "Dict", + min_keyword_length = 3, + max_items = 10, + opts = { + dictionary_files = function() + if vim.bo.filetype == "markdown" or vim.bo.filetype == "gitcommit" then + return {} + end + return {} + end, + }, + }, + }, + }, + cmdline = { + enabled = false, + }, + appearance = { + nerd_font_variant = "normal", + 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 = "󰅲", + } + } +}) diff --git a/modules/home-manager/cli/neovim/files/plugins/cmp.lua b/modules/home-manager/cli/neovim/files/plugins/cmp.lua deleted file mode 100644 index dfbc0ff..0000000 --- a/modules/home-manager/cli/neovim/files/plugins/cmp.lua +++ /dev/null @@ -1,98 +0,0 @@ -local has_words_before = function() - unpack = unpack or table.unpack - local line, col = unpack(vim.api.nvim_win_get_cursor(0)) - return col ~= 0 and vim.api.nvim_buf_get_lines( - 0, - line - 1, - line, - true - )[1]:sub(col, col):match('%s') == nil -end - -local get_ws = function (max, len) - return (" "):rep(max - len) -end - --- Add additional capabilities supported by nvim-cmp -local capabilities = require('cmp_nvim_lsp').default_capabilities() -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 = "󰅲", -} --- nvim-cmp setup -local cmp = require 'cmp' -cmp.setup { - mapping = { - [""] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - -- You could replace the expand_or_jumpable() calls with expand_or_locally_jumpable() - -- they way you will only jump inside the snippet region - elseif luasnip.expand_or_jumpable() then - luasnip.expand_or_jump() - elseif has_words_before() then - cmp.complete() - else - fallback() - end - end, { "i", "s" }), - - [""] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, { "i", "s" }), - [""] = cmp.mapping(cmp.mapping.scroll_docs(-4), {'i', 'c'}), - [""] = cmp.mapping(cmp.mapping.scroll_docs(4), {'i', 'c'}), - [""] = cmp.mapping(cmp.mapping.complete(), {'i', 'c'}), - [""] = cmp.mapping({ i = cmp.mapping.close(), c = cmp.mapping.close() }), - }, - formatting = { - format = function(_, vim_item) - vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) - - local content = vim_item.abbr - if #content > 25 then - vim_item.abbr = vim.fn.strcharpart(content, 0, 25) .. "…" - else - vim_item.abbr = content .. get_ws(25, #content) - end - - return vim_item - end, - }, - sources = { - {name = 'path'}, - {name = 'nvim_lsp', keyword_length = 1}, - {name = 'buffer', keyword_length = 3}, - {name = 'luasnip', keyword_length = 2}, - }, -}