From 26c4a7e3c33e739d474ddaf52aa4c5f3d11922ba Mon Sep 17 00:00:00 2001 From: Axel Baudot <74733630+axelbdt@users.noreply.github.com> Date: Sun, 7 Dec 2025 09:54:42 -0500 Subject: [PATCH] assistant/neocodeium: init (#1238) Co-authored-by: Ching Pei Yang <59727193+horriblename@users.noreply.github.com> --- docs/release-notes/rl-0.8.md | 6 + modules/plugins/assistant/default.nix | 1 + .../plugins/assistant/neocodeium/config.nix | 33 ++++ .../plugins/assistant/neocodeium/default.nix | 6 + .../assistant/neocodeium/neocodeium.nix | 155 ++++++++++++++++++ npins/sources.json | 16 ++ 6 files changed, 217 insertions(+) create mode 100644 modules/plugins/assistant/neocodeium/config.nix create mode 100644 modules/plugins/assistant/neocodeium/default.nix create mode 100644 modules/plugins/assistant/neocodeium/neocodeium.nix diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index 446130cb..96819a48 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -511,6 +511,12 @@ - Add inline typst concealing support under `vim.languages.typst` using [typst-concealer]. +[axelbdt](https://github.com/axelbdt): + +[neocodeium]: https://github.com/monkoose/neocodeium + +- Add [neocodeium] plugin in `vim.assistant.neocodeium` with `enable`, `setupOpts` and `keymaps` + [JudahZF](https://github.com/JudahZF): - Added gitFiles mapping option to telescope diff --git a/modules/plugins/assistant/default.nix b/modules/plugins/assistant/default.nix index a4da583a..d86b1c31 100644 --- a/modules/plugins/assistant/default.nix +++ b/modules/plugins/assistant/default.nix @@ -5,5 +5,6 @@ ./codecompanion ./supermaven-nvim ./avante + ./neocodeium ]; } diff --git a/modules/plugins/assistant/neocodeium/config.nix b/modules/plugins/assistant/neocodeium/config.nix new file mode 100644 index 00000000..3e444108 --- /dev/null +++ b/modules/plugins/assistant/neocodeium/config.nix @@ -0,0 +1,33 @@ +{ + config, + lib, + options, + ... +}: let + inherit (lib.nvim.binds) mkKeymap; + cfg = config.vim.assistant.neocodeium; + + inherit (options.vim.assistant.neocodeium) keymaps; + mkNeoCodeiumKey = act: (mkKeymap "i" cfg.keymaps.${act} "function() require('neocodeium').${act}() end" { + lua = true; + desc = keymaps.${act}.description; + }); +in { + config = lib.mkIf cfg.enable { + vim = { + lazy.plugins.neocodeium = { + package = "neocodeium"; + setupModule = "neocodeium"; + inherit (cfg) setupOpts; + }; + keymaps = [ + (mkNeoCodeiumKey "accept") + (mkNeoCodeiumKey "accept_word") + (mkNeoCodeiumKey "accept_line") + (mkNeoCodeiumKey "cycle_or_complete") + (mkNeoCodeiumKey "cycle_or_complete_reverse") + (mkNeoCodeiumKey "clear") + ]; + }; + }; +} diff --git a/modules/plugins/assistant/neocodeium/default.nix b/modules/plugins/assistant/neocodeium/default.nix new file mode 100644 index 00000000..0b5a170c --- /dev/null +++ b/modules/plugins/assistant/neocodeium/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./neocodeium.nix + ./config.nix + ]; +} diff --git a/modules/plugins/assistant/neocodeium/neocodeium.nix b/modules/plugins/assistant/neocodeium/neocodeium.nix new file mode 100644 index 00000000..d2ce958c --- /dev/null +++ b/modules/plugins/assistant/neocodeium/neocodeium.nix @@ -0,0 +1,155 @@ +{lib, ...}: let + inherit + (lib.types) + nullOr + str + bool + int + attrsOf + listOf + enum + ; + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.nvim.types) mkPluginSetupOption luaInline; + inherit (lib.nvim.binds) mkMappingOption; +in { + options.vim.assistant.neocodeium = { + enable = mkEnableOption "NeoCodeium AI completion"; + + setupOpts = mkPluginSetupOption "NeoCodeium" { + enabled = mkOption { + type = nullOr bool; + default = null; + description = "Whether to start windsurf server. Can be manually enabled with `:NeoCodeium enable`"; + }; + + bin = mkOption { + type = nullOr str; + default = null; + description = "Path to custom windsurf server binary"; + }; + + manual = mkOption { + type = nullOr bool; + default = null; + description = "When true, autosuggestions are disabled. Use `require'neocodeium'.cycle_or_complete()` to show suggestions manually"; + }; + + server = { + api_url = mkOption { + type = nullOr str; + default = null; + description = "API URL to use (for Enterprise mode)"; + }; + portal_url = mkOption { + type = nullOr str; + default = null; + description = "Portal URL to use (for registering a user and downloading the binary)"; + }; + }; + + show_label = mkOption { + type = nullOr bool; + default = null; + description = "Whether to show the number of suggestions label in the line number column"; + }; + + debounce = mkOption { + type = nullOr bool; + default = null; + description = "Whether to enable suggestions debounce"; + }; + + max_lines = mkOption { + type = nullOr int; + default = null; + example = 10000; + description = '' + Maximum number of lines parsed from loaded buffers (current buffer always fully parsed). + Set to `0` to disable parsing non-current buffers. + Set to `-1` to parse all lines + ''; + }; + + silent = mkOption { + type = nullOr bool; + default = null; + description = "Whether to disable non-important messages"; + }; + + disable_in_special_buftypes = mkOption { + type = nullOr bool; + default = null; + description = "Whether to disable suggestions in special buftypes like `nofile`"; + }; + + log_level = mkOption { + type = nullOr (enum [ + "trace" + "debug" + "info" + "warn" + "error" + ]); + default = null; + example = "warn"; + description = "Log level"; + }; + + single_line = { + enabled = mkOption { + type = nullOr bool; + default = null; + description = "Whether to enable single line mode. Multi-line suggestions collapse into a single line"; + }; + label = mkOption { + type = nullOr str; + default = null; + example = "..."; + description = "Label indicating that there is multi-line suggestion"; + }; + }; + + filter = mkOption { + type = nullOr luaInline; + default = null; + description = '' + Function that returns `true` if a buffer should be enabled and `false` if disabled. + You can still enable disabled buffer with `:NeoCodeium enable_buffer` + ''; + }; + + filetypes = mkOption { + type = nullOr (attrsOf bool); + default = null; + example = { + help = false; + gitcommit = false; + }; + description = '' + Filetypes to disable suggestions in. + You can still enable disabled buffer with `:NeoCodeium enable_buffer` + ''; + }; + + root_dir = mkOption { + type = nullOr (listOf str); + default = null; + example = [ + ".git" + "package.json" + ]; + description = "List of directories and files to detect workspace root directory for Windsurf Chat"; + }; + }; + + keymaps = { + accept = mkMappingOption "Accept suggestion" ""; + accept_word = mkMappingOption "Accept word" ""; + accept_line = mkMappingOption "Accept line" ""; + cycle_or_complete = mkMappingOption "Cycle or complete" ""; + cycle_or_complete_reverse = mkMappingOption "Cycle or complete (reverse)" ""; + clear = mkMappingOption "Clear suggestion" ""; + }; + }; +} diff --git a/npins/sources.json b/npins/sources.json index 5bcb9567..78b67216 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -1578,6 +1578,22 @@ "url": "https://github.com/nvim-neo-tree/neo-tree.nvim/archive/9130e58424ad95bf2dd8b40afbb8cf04d648638c.tar.gz", "hash": "0zm40p718cvqg9ngzlnc56pbglrp7yp1580g0f1pfakkwdrvnhdv" }, + "neocodeium": { + "type": "GitRelease", + "repository": { + "type": "GitHub", + "owner": "monkoose", + "repo": "neocodeium" + }, + "pre_releases": false, + "version_upper_bound": null, + "release_prefix": null, + "submodules": false, + "version": "v1.16.3", + "revision": "f67384cee91f8ffc0d2e09d257691b2461725d5b", + "url": "https://api.github.com/repos/monkoose/neocodeium/tarball/v1.16.3", + "hash": "1zr6rrvk00d3gwg7sf1vqd1z1gw2qwl0h08zcbc30x8v0iradsai" + }, "neocord": { "type": "Git", "repository": {