From 7e66c747ef7e807f482f1871f74861c036a2770d Mon Sep 17 00:00:00 2001 From: oddlama Date: Sun, 5 Jan 2025 15:25:57 +0100 Subject: [PATCH] feat: switch nvim to blink.cmp --- users/myuser/neovim/appearance.nix | 2 +- users/myuser/neovim/completion.nix | 430 +++++++++++++++++------------ users/myuser/neovim/languages.nix | 4 +- 3 files changed, 264 insertions(+), 172 deletions(-) diff --git a/users/myuser/neovim/appearance.nix b/users/myuser/neovim/appearance.nix index 245aea8..6a876fa 100644 --- a/users/myuser/neovim/appearance.nix +++ b/users/myuser/neovim/appearance.nix @@ -53,7 +53,7 @@ # Status updates for LSP progress in right bottom corner. fidget.enable = true; # Show colors - nvim-colorizer.enable = true; + colorizer.enable = true; # Breadcrumbs # TODO navic.enable = true; or dropbar? diff --git a/users/myuser/neovim/completion.nix b/users/myuser/neovim/completion.nix index 3a3cc01..eff4576 100644 --- a/users/myuser/neovim/completion.nix +++ b/users/myuser/neovim/completion.nix @@ -1,182 +1,274 @@ { programs.nixvim = { plugins = { - luasnip = { + blink-compat.enable = true; + + blink-cmp = { enable = true; settings = { - history = true; - # Update dynamic snippets while typing - updateevents = "TextChanged,TextChangedI"; - enable_autosnippets = true; - }; - }; - - cmp_luasnip.enable = true; - cmp-dap.enable = true; - cmp-cmdline.enable = true; - cmp-cmdline-history.enable = true; - cmp-path.enable = true; - cmp-emoji.enable = true; - cmp-treesitter.enable = true; - cmp-nvim-lsp.enable = true; - cmp-nvim-lsp-document-symbol.enable = true; - cmp-nvim-lsp-signature-help.enable = true; - cmp = { - enable = true; - settings = { - sources = [ - { name = "nvim_lsp_signature_help"; } - { name = "nvim_lsp"; } - { name = "nvim_lsp_document_symbol"; } - { name = "path"; } - { name = "treesitter"; } - { name = "dap"; } - # {name = "luasnip";} - { name = "emoji"; } - ]; - mapping = { - "" = - # lua - '' - cmp.mapping.confirm({ - behavior = cmp.ConfirmBehavior.Replace, - select = false, - }) - ''; - "" = - # lua - "cmp.mapping.scroll_docs(-4)"; - "" = - # lua - "cmp.mapping.scroll_docs(4)"; - "" = - # lua - "cmp.mapping.abort()"; - "" = - # lua - '' - cmp.mapping(function(fallback) - local has_words_before = function() - local line, col = table.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 - - if cmp.visible() then - cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) - elseif require("luasnip").expandable() then - require("luasnip").expand() - elseif require("luasnip").expand_or_locally_jumpable() then - require("luasnip").expand_or_jump() - --elseif has_words_before() then - -- cmp.complete() - else - fallback() - end - end, {"i", "s"}) - ''; - "" = - # lua - ''cmp.mapping(cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }), {'i'})''; - "" = - # lua - ''cmp.mapping(cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }), {'i'})''; - "" = - # lua - ''cmp.mapping(cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select, count = -10 }), {'i'})''; - "" = - # lua - ''cmp.mapping(cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select, count = 10 }), {'i'})''; - "" = - # lua - '' - cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) - elseif luasnip.jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, {"i", "s"}) - ''; + keymap = { + preset = "enter"; + "" = [ + "snippet_forward" + "fallback" + ]; + "" = [ + "snippet_backward" + "fallback" + ]; + "" = [ + "select_next" + "fallback" + ]; + "" = [ + "select_prev" + "fallback" + ]; + }; + + appearance = { + use_nvim_cmp_as_default = true; + nerd_font_variant = "mono"; + }; + + sources = { + default = [ + "lsp" + "path" + "snippets" + "emoji" + "buffer" + ]; + providers = { + emoji = { + name = "emoji"; + module = "blink.compat.source"; + }; + }; + }; + + signature.enabled = true; + completion = { + list.selection = "manual"; + # menu = { + # border = "none"; + # draw = { + # gap = 1; + # treesitter = [ "lsp" ]; + # columns = [ + # { + # __unkeyed-1 = "label"; + # } + # { + # __unkeyed-1 = "kind_icon"; + # __unkeyed-2 = "kind"; + # gap = 1; + # } + # { __unkeyed-1 = "source_name"; } + # ]; + # }; + # }; + # trigger = { + # show_in_snippet = false; + # }; + documentation = { + auto_show = true; + # window = { + # border = "rounded"; + # }; + }; + # accept = { + # auto_brackets = { + # enabled = true; + # }; + # }; }; - formatting.fields = [ - "abbr" - "kind" - "menu" - ]; - formatting.format = - # lua - '' - function(_, vim_item) - local icons = { - Namespace = "󰌗", - 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 = "󰊄", - Table = "", - Object = "󰅩", - Tag = "", - Array = "󰅪", - Boolean = "", - Number = "", - Null = "󰟢", - String = "󰉿", - Calendar = "", - Watch = "󰥔", - Package = "", - Copilot = "", - Codeium = "", - TabNine = "", - } - vim_item.kind = string.format("%s %s", icons[vim_item.kind], vim_item.kind) - return vim_item - end - ''; - snippet.expand = - # lua - '' - function(args) - require('luasnip').lsp_expand(args.body) - end - ''; }; }; - # TODO use "ray-x/lsp_signature.nvim" + cmp-emoji.enable = true; + + lsp.capabilities = # lua + '' + capabilities = require('blink.cmp').get_lsp_capabilities(capabilities) + ''; + + # luasnip = { + # enable = true; + # settings = { + # history = true; + # # Update dynamic snippets while typing + # updateevents = "TextChanged,TextChangedI"; + # enable_autosnippets = true; + # }; + # }; + # + # cmp_luasnip.enable = true; + # cmp-dap.enable = true; + # cmp-cmdline.enable = true; + # cmp-cmdline-history.enable = true; + # cmp-path.enable = true; + # cmp-emoji.enable = true; + # cmp-treesitter.enable = true; + # cmp-nvim-lsp.enable = true; + # cmp-nvim-lsp-document-symbol.enable = true; + # cmp-nvim-lsp-signature-help.enable = true; + # cmp = { + # enable = true; + # settings = { + # sources = [ + # { name = "nvim_lsp_signature_help"; } + # { name = "nvim_lsp"; } + # { name = "nvim_lsp_document_symbol"; } + # { name = "path"; } + # { name = "treesitter"; } + # { name = "dap"; } + # # {name = "luasnip";} + # { name = "emoji"; } + # ]; + # mapping = { + # "" = + # # lua + # '' + # cmp.mapping.confirm({ + # behavior = cmp.ConfirmBehavior.Replace, + # select = false, + # }) + # ''; + # "" = + # # lua + # "cmp.mapping.scroll_docs(-4)"; + # "" = + # # lua + # "cmp.mapping.scroll_docs(4)"; + # "" = + # # lua + # "cmp.mapping.abort()"; + # "" = + # # lua + # '' + # cmp.mapping(function(fallback) + # local has_words_before = function() + # local line, col = table.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 + # + # if cmp.visible() then + # cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) + # elseif require("luasnip").expandable() then + # require("luasnip").expand() + # elseif require("luasnip").expand_or_locally_jumpable() then + # require("luasnip").expand_or_jump() + # --elseif has_words_before() then + # -- cmp.complete() + # else + # fallback() + # end + # end, {"i", "s"}) + # ''; + # "" = + # # lua + # ''cmp.mapping(cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }), {'i'})''; + # "" = + # # lua + # ''cmp.mapping(cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }), {'i'})''; + # "" = + # # lua + # ''cmp.mapping(cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select, count = -10 }), {'i'})''; + # "" = + # # lua + # ''cmp.mapping(cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select, count = 10 }), {'i'})''; + # "" = + # # lua + # '' + # cmp.mapping(function(fallback) + # if cmp.visible() then + # cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) + # elseif luasnip.jumpable(-1) then + # luasnip.jump(-1) + # else + # fallback() + # end + # end, {"i", "s"}) + # ''; + # }; + # formatting.fields = [ + # "abbr" + # "kind" + # "menu" + # ]; + # formatting.format = + # # lua + # '' + # function(_, vim_item) + # local icons = { + # Namespace = "󰌗", + # 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 = "󰊄", + # Table = "", + # Object = "󰅩", + # Tag = "", + # Array = "󰅪", + # Boolean = "", + # Number = "", + # Null = "󰟢", + # String = "󰉿", + # Calendar = "", + # Watch = "󰥔", + # Package = "", + # Copilot = "", + # Codeium = "", + # TabNine = "", + # } + # vim_item.kind = string.format("%s %s", icons[vim_item.kind], vim_item.kind) + # return vim_item + # end + # ''; + # snippet.expand = + # # lua + # '' + # function(args) + # require('luasnip').lsp_expand(args.body) + # end + # ''; + # }; + # }; + # + # # TODO use "ray-x/lsp_signature.nvim" }; - extraConfigLuaPost = '' - local cmp = require "cmp" - cmp.setup.cmdline(":", { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = "cmdline" }, - { name = "cmp-cmdline-history" }, - }, - }) - ''; + # extraConfigLuaPost = '' + # local cmp = require "cmp" + # cmp.setup.cmdline(":", { + # mapping = cmp.mapping.preset.cmdline(), + # sources = { + # { name = "cmdline" }, + # { name = "cmp-cmdline-history" }, + # }, + # }) + # ''; }; } diff --git a/users/myuser/neovim/languages.nix b/users/myuser/neovim/languages.nix index 79e8068..8c4a5e2 100644 --- a/users/myuser/neovim/languages.nix +++ b/users/myuser/neovim/languages.nix @@ -28,9 +28,9 @@ }; # Cargo.toml dependency completion - crates-nvim = { + crates = { enable = true; - extraOptions = { + settings = { completion.cmp.enabled = true; }; };