From 2dde21e19c879d9c7b079a0629e27327739ebf28 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 20:55:21 +0100 Subject: [PATCH 01/12] flake: add and package blink.cmp --- flake.lock | 34 ++++++++++++++++++++ flake.nix | 10 ++++++ modules/wrapper/build/config.nix | 4 +++ modules/wrapper/build/packages/blink-cmp.nix | 34 ++++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 modules/wrapper/build/packages/blink-cmp.nix diff --git a/flake.lock b/flake.lock index 8e5a40d7..457ec862 100644 --- a/flake.lock +++ b/flake.lock @@ -167,6 +167,38 @@ "type": "github" } }, + "plugin-blink-cmp": { + "flake": false, + "locked": { + "lastModified": 1736295934, + "narHash": "sha256-MfHI4efAdaoCU8si6YFdznZmSTprthDq3YKuF91z7ss=", + "owner": "saghen", + "repo": "blink.cmp", + "rev": "1cc3b1a908fbcfd15451c4772759549724f38524", + "type": "github" + }, + "original": { + "owner": "saghen", + "repo": "blink.cmp", + "type": "github" + } + }, + "plugin-blink-compat": { + "flake": false, + "locked": { + "lastModified": 1734896240, + "narHash": "sha256-Rrrh+O3FbBnaAnCHwPuQyfhH+XueSkQp6ipEkn6esGY=", + "owner": "saghen", + "repo": "blink.compat", + "rev": "74b251a1e9478c4fa6d7c6bc2921d7124e6f6cbb", + "type": "github" + }, + "original": { + "owner": "saghen", + "repo": "blink.compat", + "type": "github" + } + }, "plugin-bufdelete-nvim": { "flake": false, "locked": { @@ -2788,6 +2820,8 @@ "plugin-aerial-nvim": "plugin-aerial-nvim", "plugin-alpha-nvim": "plugin-alpha-nvim", "plugin-base16": "plugin-base16", + "plugin-blink-cmp": "plugin-blink-cmp", + "plugin-blink-compat": "plugin-blink-compat", "plugin-bufdelete-nvim": "plugin-bufdelete-nvim", "plugin-catppuccin": "plugin-catppuccin", "plugin-ccc": "plugin-ccc", diff --git a/flake.nix b/flake.nix index a9d158a3..57b92e2f 100644 --- a/flake.nix +++ b/flake.nix @@ -294,6 +294,16 @@ flake = false; }; + plugin-blink-cmp = { + url = "github:saghen/blink.cmp"; + flake = false; + }; + + plugin-blink-compat = { + url = "github:saghen/blink.compat"; + flake = false; + }; + plugin-nvim-cmp = { url = "github:hrsh7th/nvim-cmp"; flake = false; diff --git a/modules/wrapper/build/config.nix b/modules/wrapper/build/config.nix index 46d99b36..6a1c031b 100644 --- a/modules/wrapper/build/config.nix +++ b/modules/wrapper/build/config.nix @@ -61,6 +61,10 @@ "flutter-tools.dev_tools" ]; }; + blink-cmp = pkgs.callPackage ./packages/blink-cmp.nix { + src = inputs.plugin-blink-cmp; + version = inputs.plugin-blink-cmp.shortRev or inputs.plugin-blink-cmp.shortDirtyRev or "dirty"; + }; }; buildConfigPlugins = plugins: diff --git a/modules/wrapper/build/packages/blink-cmp.nix b/modules/wrapper/build/packages/blink-cmp.nix new file mode 100644 index 00000000..537995f8 --- /dev/null +++ b/modules/wrapper/build/packages/blink-cmp.nix @@ -0,0 +1,34 @@ +{ + rustPlatform, + hostPlatform, + vimUtils, + git, + src, + version, +}: let + blink-fuzzy-lib = rustPlatform.buildRustPackage { + pname = "blink-fuzzy-lib"; + inherit version src; + + nativeBuildInputs = [git]; + cargoLock = { + lockFile = "${src}/Cargo.lock"; + allowBuiltinFetchGit = true; + }; + }; + libExt = + if hostPlatform.isDarwin + then "dylib" + else "so"; +in + vimUtils.buildVimPlugin { + pname = "blink-cmp"; + inherit version src; + + # blink references a repro.lua which is placed outside the lua/ directory + doCheck = false; + preInstall = '' + mkdir -p target/release + ln -s ${blink-fuzzy-lib}/lib/libblink_cmp_fuzzy.${libExt} target/release/libblink_cmp_fuzzy.${libExt} + ''; + } From d2424e7913e6adfd01321558d403655269ad6b4c Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:02:01 +0100 Subject: [PATCH 02/12] blink: init --- .../completion/blink-cmp/blink-cmp.nix | 120 ++++++++++++++++++ .../plugins/completion/blink-cmp/config.nix | 90 +++++++++++++ .../plugins/completion/blink-cmp/default.nix | 6 + modules/plugins/completion/default.nix | 1 + 4 files changed, 217 insertions(+) create mode 100644 modules/plugins/completion/blink-cmp/blink-cmp.nix create mode 100644 modules/plugins/completion/blink-cmp/config.nix create mode 100644 modules/plugins/completion/blink-cmp/default.nix diff --git a/modules/plugins/completion/blink-cmp/blink-cmp.nix b/modules/plugins/completion/blink-cmp/blink-cmp.nix new file mode 100644 index 00000000..e56ac4cc --- /dev/null +++ b/modules/plugins/completion/blink-cmp/blink-cmp.nix @@ -0,0 +1,120 @@ +{lib, ...}: let + inherit (lib.options) mkEnableOption mkOption literalMD; + inherit (lib.types) listOf str either attrsOf submodule enum anything int nullOr; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.types) mkPluginSetupOption luaInline; + inherit (lib.nvim.binds) mkMappingOption; + inherit (lib.nvim.config) mkBool; + + keymapType = submodule { + freeformType = attrsOf (listOf (either str luaInline)); + options = { + preset = mkOption { + type = enum ["default" "none" "super-tab" "enter"]; + default = "none"; + description = "keymap presets"; + }; + }; + }; + + providerType = submodule { + freeformType = anything; + options = { + module = mkOption { + type = str; + description = "module of the provider"; + }; + }; + }; +in { + options.vim.autocomplete.blink-cmp = { + enable = mkEnableOption "blink.cmp"; + setupOpts = mkPluginSetupOption "blink.cmp" { + sources = { + default = mkOption { + type = listOf str; + default = ["lsp" "path" "snippets" "buffer"]; + description = "Default list of sources to enable for completion."; + }; + + cmdline = mkOption { + type = nullOr (listOf str); + default = []; + description = "List of sources to enable for cmdline. Null means use default source list."; + }; + + providers = mkOption { + type = attrsOf providerType; + default = {}; + description = "Settings for completion providers"; + }; + + transform_items = mkOption { + type = nullOr luaInline; + default = mkLuaInline "function(_, items) return items end"; + defaultText = '' + Our default does nothing. If you want blink.cmp's default, which + lowers the score for snippets, set this option to null. + ''; + description = '' + Function to use when transforming the items before they're returned + for all providers. + ''; + }; + }; + + completion = { + documentation = { + auto_show = mkBool true "Show documentation whenever an item is selected"; + auto_show_delay_ms = mkOption { + type = int; + default = 200; + description = "Delay before auto show triggers"; + }; + }; + }; + + keymap = mkOption { + type = keymapType; + default = {}; + description = "blink.cmp keymap"; + example = literalMD '' + ```nix + vim.autocomplete.blink-cmp.setupOpts.keymap = { + preset = "none"; + + "" = ["select_prev" "fallback"]; + "" = [ + (lib.generators.mkLuaInline '''' + function(cmp) + if some_condition then return end -- runs the next command + return true -- doesn't run the next command + end, + '''') + "select_next" + ]; + }; + ``` + ''; + }; + + fuzzy = { + prebuilt_binaries = { + download = mkBool false '' + Auto-downloads prebuilt binaries. Do not enable, it doesn't work on nix + ''; + }; + }; + }; + + mappings = { + complete = mkMappingOption "Complete [blink.cmp]" ""; + confirm = mkMappingOption "Confirm [blink.cmp]" ""; + next = mkMappingOption "Next item [blink.cmp]" ""; + previous = mkMappingOption "Previous item [blink.cmp]" ""; + close = mkMappingOption "Close [blink.cmp]" ""; + scrollDocsUp = mkMappingOption "Scroll docs up [blink.cmp]" ""; + scrollDocsDown = mkMappingOption "Scroll docs down [blink.cmp]" ""; + }; + }; +} diff --git a/modules/plugins/completion/blink-cmp/config.nix b/modules/plugins/completion/blink-cmp/config.nix new file mode 100644 index 00000000..1141b7e9 --- /dev/null +++ b/modules/plugins/completion/blink-cmp/config.nix @@ -0,0 +1,90 @@ +{ + lib, + config, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.strings) optionalString; + inherit (lib.generators) mkLuaInline; + inherit (lib.nvim.lua) toLuaObject; + inherit (builtins) concatStringsSep typeOf tryEval attrNames mapAttrs; + + cfg = config.vim.autocomplete.blink-cmp; + cmpCfg = config.vim.autocomplete.nvim-cmp; + inherit (cfg) mappings; + + getPluginName = plugin: + if typeOf plugin == "string" + then plugin + else if (plugin ? pname && (tryEval plugin.pname).success) + then plugin.pname + else plugin.name; +in { + vim = mkIf cfg.enable { + startPlugins = ["blink-compat"]; + lazy.plugins = { + blink-cmp = { + package = "blink-cmp"; + setupModule = "blink.cmp"; + inherit (cfg) setupOpts; + + # TODO: lazy disabled until lspconfig is lazy loaded + # + # event = ["InsertEnter" "CmdlineEnter"]; + + after = '' + ${optionalString config.vim.lazy.enable + (concatStringsSep "\n" (map + (package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})") + cmpCfg.sourcePlugins))} + ''; + }; + }; + + autocomplete = { + blink-cmp.setupOpts = { + sources = { + default = ["lsp" "path" "snippets" "buffer"] ++ (attrNames cmpCfg.sources); + providers = + mapAttrs (name: _: { + inherit name; + module = "blink.compat.source"; + }) + cmpCfg.sources; + }; + snippets = mkIf config.vim.snippets.luasnip.enable { + preset = "luasnip"; + }; + + keymap = { + ${mappings.complete} = ["show" "fallback"]; + ${mappings.close} = ["hide" "fallback"]; + ${mappings.scrollDocsUp} = ["scroll_documentation_up" "fallback"]; + ${mappings.scrollDocsDown} = ["scroll_documentation_down" "fallback"]; + ${mappings.confirm} = ["accept" "fallback"]; + + ${mappings.next} = [ + "select_next" + "snippet_forward" + (mkLuaInline '' + function(cmp) + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + has_words_before = col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil + + if has_words_before then + return cmp.show() + end + end + '') + "fallback" + ]; + ${mappings.previous} = [ + "select_prev" + "snippet_backward" + "fallback" + ]; + }; + }; + }; + }; +} diff --git a/modules/plugins/completion/blink-cmp/default.nix b/modules/plugins/completion/blink-cmp/default.nix new file mode 100644 index 00000000..3e2d7e6b --- /dev/null +++ b/modules/plugins/completion/blink-cmp/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./blink-cmp.nix + ./config.nix + ]; +} diff --git a/modules/plugins/completion/default.nix b/modules/plugins/completion/default.nix index 0cae45f6..0c0a61a0 100644 --- a/modules/plugins/completion/default.nix +++ b/modules/plugins/completion/default.nix @@ -1,5 +1,6 @@ { imports = [ ./nvim-cmp + ./blink-cmp ]; } From 214e2d597efb16e2528f9e7c5817d048151c0caf Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:03:21 +0100 Subject: [PATCH 03/12] lsp: add blink integration --- modules/plugins/lsp/config.nix | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/plugins/lsp/config.nix b/modules/plugins/lsp/config.nix index e73a5387..0fa16e47 100644 --- a/modules/plugins/lsp/config.nix +++ b/modules/plugins/lsp/config.nix @@ -11,6 +11,7 @@ cfg = config.vim.lsp; usingNvimCmp = config.vim.autocomplete.nvim-cmp.enable; + usingBlinkCmp = config.vim.autocomplete.blink-cmp.enable; self = import ./module.nix {inherit config lib pkgs;}; mappingDefinitions = self.options.vim.lsp.mappings; @@ -22,7 +23,7 @@ in { config = mkIf cfg.enable { vim = { - autocomplete.nvim-cmp = { + autocomplete.nvim-cmp = mkIf usingNvimCmp { sources = {nvim_lsp = "[LSP]";}; sourcePlugins = ["cmp-nvim-lsp"]; }; @@ -170,6 +171,10 @@ in { }, } ''} + + ${optionalString usingBlinkCmp '' + capabilities = require('blink.cmp').get_lsp_capabilities() + ''} ''; }; }; From 102d103986dd977267197c568e620eadadbd1167 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:03:48 +0100 Subject: [PATCH 04/12] lsp-signature: assert against using with blink --- modules/plugins/lsp/lsp-signature/config.nix | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/plugins/lsp/lsp-signature/config.nix b/modules/plugins/lsp/lsp-signature/config.nix index c9940534..535b2534 100644 --- a/modules/plugins/lsp/lsp-signature/config.nix +++ b/modules/plugins/lsp/lsp-signature/config.nix @@ -10,6 +10,16 @@ cfg = config.vim.lsp; in { config = mkIf (cfg.enable && cfg.lspSignature.enable) { + assertions = [ + { + assertion = !config.vim.autocomplete.blink-cmp.enable; + message = '' + lsp-signature does not work with blink.cmp. Please use blink.cmp's builtin signature feature: + + vim.autocomplete.blink-cmp.setupOpts.signature.enabled = true; + ''; + } + ]; vim = { startPlugins = [ "lsp-signature" From 5a42eff8fda6ef52fd0d0a7ce0a7e7540702fc21 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:04:16 +0100 Subject: [PATCH 05/12] luasnip: only add cmp source if cmp enabled --- modules/plugins/snippets/luasnip/config.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/plugins/snippets/luasnip/config.nix b/modules/plugins/snippets/luasnip/config.nix index b05f9f27..11be37c1 100644 --- a/modules/plugins/snippets/luasnip/config.nix +++ b/modules/plugins/snippets/luasnip/config.nix @@ -20,7 +20,7 @@ in { after = cfg.loaders; }; startPlugins = cfg.providers; - autocomplete.nvim-cmp = { + autocomplete.nvim-cmp = mkIf config.vim.autocomplete.nvim-cmp.enable { sources = {luasnip = "[LuaSnip]";}; sourcePlugins = ["cmp-luasnip"]; }; From 2a9a662f450a9a3fce1f0e651fa794a77c96f532 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:04:50 +0100 Subject: [PATCH 06/12] treesitter: disable on blink.cmp --- modules/plugins/treesitter/config.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/plugins/treesitter/config.nix b/modules/plugins/treesitter/config.nix index 566a716e..14aba5e1 100644 --- a/modules/plugins/treesitter/config.nix +++ b/modules/plugins/treesitter/config.nix @@ -20,7 +20,8 @@ in { vim = { startPlugins = ["nvim-treesitter"]; - autocomplete.nvim-cmp = { + # cmp-treesitter doesn't work on blink.cmp + autocomplete.nvim-cmp = mkIf config.vim.autocomplete.nvim-cmp.enable { sources = {treesitter = "[Treesitter]";}; sourcePlugins = ["cmp-treesitter"]; }; From 00e9f27aca2db51c02a94cae713c5709fb14f631 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:06:05 +0100 Subject: [PATCH 07/12] obsidian: enable cmp source on blink.cmp --- modules/plugins/notes/obsidian/obsidian.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/plugins/notes/obsidian/obsidian.nix b/modules/plugins/notes/obsidian/obsidian.nix index 2da2127b..17369b88 100644 --- a/modules/plugins/notes/obsidian/obsidian.nix +++ b/modules/plugins/notes/obsidian/obsidian.nix @@ -7,6 +7,8 @@ inherit (lib.types) bool str nullOr; inherit (lib.modules) mkRenamedOptionModule; inherit (lib.nvim.types) mkPluginSetupOption; + + autocompleteCfg = config.vim.autocomplete; in { imports = let renamedSetupOption = oldPath: newPath: @@ -42,7 +44,7 @@ in { # If using nvim-cmp, otherwise set to false type = bool; description = "If using nvim-cmp, otherwise set to false"; - default = config.vim.autocomplete.nvim-cmp.enable; + default = autocompleteCfg.nvim-cmp.enable || autocompleteCfg.blink-cmp.enable; }; }; }; From 9e2ddbba4992d00974203c07f2ac25c8883d82a7 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:06:15 +0100 Subject: [PATCH 08/12] docs: update release notes --- docs/release-notes/rl-0.8.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 661aee1d..361b7cda 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -47,6 +47,12 @@ - Add Haskell support under `vim.languages.haskell` using [haskell-tools.nvim]. +[horriblename](https://github.com/horriblename): + +[blink.cmp]: https://github.com/saghen/blink.cmp + +- Add [blink.cmp] support + [diniamo](https://github.com/diniamo): - Add Odin support under `vim.languages.odin`. From 122f3b3f350b3e98feb56ff0d6dcb76372b2d413 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:32:30 +0100 Subject: [PATCH 09/12] lspkind: integration with blink.cmp --- modules/plugins/lsp/lspkind/config.nix | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/plugins/lsp/lspkind/config.nix b/modules/plugins/lsp/lspkind/config.nix index 2ef20ff8..abe14524 100644 --- a/modules/plugins/lsp/lspkind/config.nix +++ b/modules/plugins/lsp/lspkind/config.nix @@ -8,16 +8,18 @@ inherit (lib.nvim.lua) toLuaObject; cfg = config.vim.lsp.lspkind; + usingCmp = config.vim.autocomplete.nvim-cmp.enable; + usingBlink = config.vim.autocomplete.blink-cmp.enable; in { config = mkIf cfg.enable { assertions = [ { - assertion = config.vim.autocomplete.nvim-cmp.enable; + assertion = usingCmp || usingBlink; message = '' While lspkind supports Neovim's native lsp upstream, using that over - nvim-cmp isn't recommended, nor supported by nvf. + nvim-cmp/blink.cmp isn't recommended, nor supported by nvf. - Please migrate to nvim-cmp if you want to use lspkind. + Please migrate to nvim-cmp/blink.cmp if you want to use lspkind. ''; } ]; @@ -26,9 +28,19 @@ in { startPlugins = ["lspkind"]; lsp.lspkind.setupOpts.before = config.vim.autocomplete.nvim-cmp.format; - autocomplete.nvim-cmp.setupOpts.formatting.format = mkForce (mkLuaInline '' - require("lspkind").cmp_format(${toLuaObject cfg.setupOpts}) - ''); + autocomplete = { + nvim-cmp = mkIf usingCmp { + setupOpts.formatting.format = mkForce (mkLuaInline '' + require("lspkind").cmp_format(${toLuaObject cfg.setupOpts}) + ''); + }; + + blink-cmp = mkIf usingBlink { + setupOpts.appearance.kind_icons = mkLuaInline '' + require("lspkind").symbol_map + ''; + }; + }; }; }; } From 9dccd4b4a8d8b7c11461032cd18965b10f8e7907 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Sat, 11 Jan 2025 21:46:49 +0100 Subject: [PATCH 10/12] autocomplete: move shared code into common parent --- .../plugins/completion/blink-cmp/config.nix | 1 + modules/plugins/completion/config.nix | 34 +++ modules/plugins/completion/default.nix | 3 + modules/plugins/completion/module.nix | 7 + .../plugins/completion/nvim-cmp/config.nix | 201 +++++++++--------- 5 files changed, 140 insertions(+), 106 deletions(-) create mode 100644 modules/plugins/completion/config.nix create mode 100644 modules/plugins/completion/module.nix diff --git a/modules/plugins/completion/blink-cmp/config.nix b/modules/plugins/completion/blink-cmp/config.nix index 1141b7e9..914821f9 100644 --- a/modules/plugins/completion/blink-cmp/config.nix +++ b/modules/plugins/completion/blink-cmp/config.nix @@ -42,6 +42,7 @@ in { }; autocomplete = { + enableSharedCmpSources = true; blink-cmp.setupOpts = { sources = { default = ["lsp" "path" "snippets" "buffer"] ++ (attrNames cmpCfg.sources); diff --git a/modules/plugins/completion/config.nix b/modules/plugins/completion/config.nix new file mode 100644 index 00000000..8fc09201 --- /dev/null +++ b/modules/plugins/completion/config.nix @@ -0,0 +1,34 @@ +{ + lib, + config, + ... +}: let + inherit (lib.modules) mkIf; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (builtins) typeOf tryEval; + + cfg = config.vim.autocomplete; + getPluginName = plugin: + if typeOf plugin == "string" + then plugin + else if (plugin ? pname && (tryEval plugin.pname).success) + then plugin.pname + else plugin.name; +in { + config.vim = mkIf cfg.enableSharedCmpSources { + startPlugins = ["rtp-nvim"]; + lazy.plugins = + mapListToAttrs (package: { + name = getPluginName package; + value = { + inherit package; + lazy = true; + after = '' + local path = vim.fn.globpath(vim.o.packpath, 'pack/*/opt/${getPluginName package}') + require("rtp_nvim").source_after_plugin_dir(path) + ''; + }; + }) + cfg.nvim-cmp.sourcePlugins; + }; +} diff --git a/modules/plugins/completion/default.nix b/modules/plugins/completion/default.nix index 0c0a61a0..bf737580 100644 --- a/modules/plugins/completion/default.nix +++ b/modules/plugins/completion/default.nix @@ -1,5 +1,8 @@ { imports = [ + ./module.nix + ./config.nix + ./nvim-cmp ./blink-cmp ]; diff --git a/modules/plugins/completion/module.nix b/modules/plugins/completion/module.nix new file mode 100644 index 00000000..eb2a32f1 --- /dev/null +++ b/modules/plugins/completion/module.nix @@ -0,0 +1,7 @@ +{lib, ...}: let + inherit (lib.options) mkEnableOption; +in { + options.vim.autocomplete = { + enableSharedCmpSources = mkEnableOption "sources shared by blink.cmp and nvim-cmp"; + }; +} diff --git a/modules/plugins/completion/nvim-cmp/config.nix b/modules/plugins/completion/nvim-cmp/config.nix index cfd3e53a..ce058876 100644 --- a/modules/plugins/completion/nvim-cmp/config.nix +++ b/modules/plugins/completion/nvim-cmp/config.nix @@ -24,114 +24,103 @@ in { config = mkIf cfg.enable { vim = { - startPlugins = ["rtp-nvim"]; - lazy.plugins = mkMerge [ - (mapListToAttrs (package: { - name = getPluginName package; - value = { - inherit package; - lazy = true; - after = '' - local path = vim.fn.globpath(vim.o.packpath, 'pack/*/opt/${getPluginName package}') - require("rtp_nvim").source_after_plugin_dir(path) + lazy.plugins = { + nvim-cmp = { + package = "nvim-cmp"; + after = '' + ${optionalString luasnipEnable "local luasnip = require('luasnip')"} + local cmp = require("cmp") + + local kinds = require("cmp.types").lsp.CompletionItemKind + local deprio = function(kind) + return function(e1, e2) + if e1:get_kind() == kind then + return false + end + if e2:get_kind() == kind then + return true + end + return nil + end + end + + cmp.setup(${toLuaObject cfg.setupOpts}) + + ${optionalString config.vim.lazy.enable + (concatStringsSep "\n" (map + (package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})") + cfg.sourcePlugins))} + ''; + + event = ["InsertEnter" "CmdlineEnter"]; + }; + }; + + autocomplete = { + enableSharedCmpSources = true; + + nvim-cmp = { + sources = { + nvim-cmp = null; + buffer = "[Buffer]"; + path = "[Path]"; + }; + + sourcePlugins = ["cmp-buffer" "cmp-path"]; + + setupOpts = { + sources = map (s: {name = s;}) (attrNames cfg.sources); + + window = mkIf borders.enable { + completion.border = borders.style; + documentation.border = borders.style; + }; + + formatting.format = cfg.format; + + # `cmp` and `luasnip` are defined above, in the `nvim-cmp` section + mapping = { + ${mappings.complete} = mkLuaInline "cmp.mapping.complete()"; + ${mappings.close} = mkLuaInline "cmp.mapping.abort()"; + ${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)"; + ${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)"; + ${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })"; + + ${mappings.next} = mkLuaInline '' + cmp.mapping(function(fallback) + local has_words_before = function() + 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 + + if cmp.visible() then + cmp.select_next_item() + ${optionalString luasnipEnable '' + elseif luasnip.locally_jumpable(1) then + luasnip.jump(1) + ''} + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end) + ''; + + ${mappings.previous} = mkLuaInline '' + cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + ${optionalString luasnipEnable '' + elseif luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + ''} + else + fallback() + end + end) ''; }; - }) - cfg.sourcePlugins) - { - nvim-cmp = { - package = "nvim-cmp"; - after = '' - ${optionalString luasnipEnable "local luasnip = require('luasnip')"} - local cmp = require("cmp") - - local kinds = require("cmp.types").lsp.CompletionItemKind - local deprio = function(kind) - return function(e1, e2) - if e1:get_kind() == kind then - return false - end - if e2:get_kind() == kind then - return true - end - return nil - end - end - - cmp.setup(${toLuaObject cfg.setupOpts}) - - ${optionalString config.vim.lazy.enable - (concatStringsSep "\n" (map - (package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})") - cfg.sourcePlugins))} - ''; - - event = ["InsertEnter" "CmdlineEnter"]; - }; - } - ]; - - autocomplete.nvim-cmp = { - sources = { - nvim-cmp = null; - buffer = "[Buffer]"; - path = "[Path]"; - }; - - sourcePlugins = ["cmp-buffer" "cmp-path"]; - - setupOpts = { - sources = map (s: {name = s;}) (attrNames cfg.sources); - - window = mkIf borders.enable { - completion.border = borders.style; - documentation.border = borders.style; - }; - - formatting.format = cfg.format; - - # `cmp` and `luasnip` are defined above, in the `nvim-cmp` section - mapping = { - ${mappings.complete} = mkLuaInline "cmp.mapping.complete()"; - ${mappings.close} = mkLuaInline "cmp.mapping.abort()"; - ${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)"; - ${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)"; - ${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })"; - - ${mappings.next} = mkLuaInline '' - cmp.mapping(function(fallback) - local has_words_before = function() - 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 - - if cmp.visible() then - cmp.select_next_item() - ${optionalString luasnipEnable '' - elseif luasnip.locally_jumpable(1) then - luasnip.jump(1) - ''} - elseif has_words_before() then - cmp.complete() - else - fallback() - end - end) - ''; - - ${mappings.previous} = mkLuaInline '' - cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item() - ${optionalString luasnipEnable '' - elseif luasnip.locally_jumpable(-1) then - luasnip.jump(-1) - ''} - else - fallback() - end - end) - ''; }; }; }; From 8a069a683569aca2b8579789943c517a14e80201 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang <59727193+horriblename@users.noreply.github.com> Date: Tue, 21 Jan 2025 13:35:01 +0800 Subject: [PATCH 11/12] blink: move package into legacyPackage --- flake/legacyPackages.nix | 6 +++++- .../build/packages => flake/legacyPackages}/blink-cmp.nix | 4 ++++ modules/wrapper/build/config.nix | 5 +---- 3 files changed, 10 insertions(+), 5 deletions(-) rename {modules/wrapper/build/packages => flake/legacyPackages}/blink-cmp.nix (87%) diff --git a/flake/legacyPackages.nix b/flake/legacyPackages.nix index b77d057a..5b6ccb6d 100644 --- a/flake/legacyPackages.nix +++ b/flake/legacyPackages.nix @@ -9,10 +9,14 @@ overlays = [ inputs.self.overlays.default - (_: _: { + (final: _: { # Build nil from source to get most recent # features as they are added. nil = inputs'.nil.packages.default; + blink-cmp = final.callPackage ./legacyPackages/blink-cmp.nix { + src = inputs.plugin-blink-cmp; + version = inputs.plugin-blink-cmp.shortRev or inputs.plugin-blink-cmp.shortDirtyRev or "dirty"; + }; }) ]; }; diff --git a/modules/wrapper/build/packages/blink-cmp.nix b/flake/legacyPackages/blink-cmp.nix similarity index 87% rename from modules/wrapper/build/packages/blink-cmp.nix rename to flake/legacyPackages/blink-cmp.nix index 537995f8..002269b9 100644 --- a/modules/wrapper/build/packages/blink-cmp.nix +++ b/flake/legacyPackages/blink-cmp.nix @@ -10,6 +10,10 @@ pname = "blink-fuzzy-lib"; inherit version src; + env = { + # TODO: remove this if plugin stops using nightly rust + RUSTC_BOOTSTRAP = true; + }; nativeBuildInputs = [git]; cargoLock = { lockFile = "${src}/Cargo.lock"; diff --git a/modules/wrapper/build/config.nix b/modules/wrapper/build/config.nix index 6a1c031b..88745fb5 100644 --- a/modules/wrapper/build/config.nix +++ b/modules/wrapper/build/config.nix @@ -61,10 +61,7 @@ "flutter-tools.dev_tools" ]; }; - blink-cmp = pkgs.callPackage ./packages/blink-cmp.nix { - src = inputs.plugin-blink-cmp; - version = inputs.plugin-blink-cmp.shortRev or inputs.plugin-blink-cmp.shortDirtyRev or "dirty"; - }; + inherit (pkgs) blink-cmp; }; buildConfigPlugins = plugins: From 88fdf831566087e6bd6eb50f1cceedf658367d7f Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Tue, 21 Jan 2025 15:51:09 +0800 Subject: [PATCH 12/12] overlay: use overlayed pkgs in .#nix and .#maximal --- flake/overlays.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake/overlays.nix b/flake/overlays.nix index 1381e7ba..5d0ff6e8 100644 --- a/flake/overlays.nix +++ b/flake/overlays.nix @@ -10,10 +10,10 @@ nixConfig = import ../configuration.nix false; maximalConfig = import ../configuration.nix true; in { - flake.overlays.default = _final: prev: { + flake.overlays.default = final: _prev: { inherit neovimConfiguration; - neovim-nix = buildPkg prev [nixConfig]; - neovim-maximal = buildPkg prev [maximalConfig]; + neovim-nix = buildPkg final [nixConfig]; + neovim-maximal = buildPkg final [maximalConfig]; devPkg = buildPkg pkgs [nixConfig {config.vim.languages.html.enable = pkgs.lib.mkForce true;}]; }; }