From 4233a2c20d77e054b4c783263878354a905ddafe Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Mon, 24 Jul 2023 16:51:24 +0300 Subject: [PATCH] feat: copilot completions in nvim-cmp sources --- configuration.nix | 5 ++++- flake.lock | 17 +++++++++++++++++ flake.nix | 5 +++++ lib/types/plugins.nix | 1 + modules/assistant/copilot/config.nix | 20 +++++++++++++++----- modules/assistant/copilot/copilot.nix | 17 ++++++++++++----- modules/completion/nvim-cmp/config.nix | 1 + 7 files changed, 55 insertions(+), 11 deletions(-) diff --git a/configuration.nix b/configuration.nix index a38a2da..250fafd 100644 --- a/configuration.nix +++ b/configuration.nix @@ -202,7 +202,10 @@ inputs: let }; vim.assistant = { - copilot.enable = isMaximal; + copilot = { + enable = isMaximal; + cmp.enable = isMaximal; + }; }; vim.session = { diff --git a/flake.lock b/flake.lock index cbd1ec7..3741f25 100644 --- a/flake.lock +++ b/flake.lock @@ -224,6 +224,22 @@ "type": "github" } }, + "copilot-cmp": { + "flake": false, + "locked": { + "lastModified": 1683831407, + "narHash": "sha256-+MzEGnhlrYRvAfskOwmw69OC1CsPXt7s3z+xPe9XPqs=", + "owner": "zbirenbaum", + "repo": "copilot-cmp", + "rev": "c2cdb3c0f5078b0619055af192295830a7987790", + "type": "github" + }, + "original": { + "owner": "zbirenbaum", + "repo": "copilot-cmp", + "type": "github" + } + }, "copilot-lua": { "flake": false, "locked": { @@ -1352,6 +1368,7 @@ "cmp-vsnip": "cmp-vsnip", "codewindow-nvim": "codewindow-nvim", "comment-nvim": "comment-nvim", + "copilot-cmp": "copilot-cmp", "copilot-lua": "copilot-lua", "crates-nvim": "crates-nvim", "dashboard-nvim": "dashboard-nvim", diff --git a/flake.nix b/flake.nix index 44af3f5..d207bff 100644 --- a/flake.nix +++ b/flake.nix @@ -481,6 +481,11 @@ flake = false; }; + copilot-cmp = { + url = "github:zbirenbaum/copilot-cmp"; + flake = false; + }; + # Session management nvim-session-manager = { url = "github:Shatur/neovim-session-manager"; diff --git a/lib/types/plugins.nix b/lib/types/plugins.nix index 111fd8c..aed65f4 100644 --- a/lib/types/plugins.nix +++ b/lib/types/plugins.nix @@ -87,6 +87,7 @@ with lib; let "nvim-surround" "nvim-dap" "nvim-dap-ui" + "copilot-cmp" ]; # You can either use the name of the plugin or a package. pluginsType = with types; diff --git a/modules/assistant/copilot/config.nix b/modules/assistant/copilot/config.nix index c920e35..349d610 100644 --- a/modules/assistant/copilot/config.nix +++ b/modules/assistant/copilot/config.nix @@ -21,16 +21,21 @@ with builtins; let ''; in { config = mkIf cfg.enable { - vim.startPlugins = [ - "copilot-lua" - cfg.copilotNodePackage - ]; + vim.startPlugins = + [ + "copilot-lua" + cfg.copilotNodePackage + ] + ++ lib.optionals (cfg.cmp.enable) [ + "copilot-cmp" + ]; vim.luaConfigRC.copilot = nvim.dag.entryAnywhere '' require("copilot").setup({ -- available options: https://github.com/zbirenbaum/copilot.lua - copilot_node_command = "${cfg.copilot_node_command}", + copilot_node_command = "${cfg.copilotNodeCommand}", panel = { + enabled = ${lib.boolToString (!cfg.cmp.enable)}, keymap = { jump_prev = false, jump_next = false, @@ -44,6 +49,7 @@ in { }, }, suggestion = { + enabled = ${lib.boolToString (!cfg.cmp.enable)}, keymap = { accept = false, accept_word = false, @@ -54,6 +60,10 @@ in { }, }, }) + + ${lib.optionalString (cfg.cmp.enable) '' + require("copilot_cmp").setup() + ''} ''; vim.maps.normal = mkMerge [ diff --git a/modules/assistant/copilot/copilot.nix b/modules/assistant/copilot/copilot.nix index 003308a..927604c 100644 --- a/modules/assistant/copilot/copilot.nix +++ b/modules/assistant/copilot/copilot.nix @@ -10,6 +10,7 @@ with builtins; let in { options.vim.assistant.copilot = { enable = mkEnableOption "GitHub Copilot AI assistant"; + cmp.enable = mkEnableOption "nvim-cmp integration for GitHub Copilot"; panel = { position = mkOption { @@ -91,16 +92,22 @@ in { }; }; - copilot_node_command = mkOption { + copilotNodeCommand = mkOption { type = types.str; default = "${lib.getExe cfg.copilotNodePackage}"; - description = "Path to nodejs"; + description = '' + The command that will be executed to initiate nodejs for GitHub Copilot. + Recommended to leave as default. + ''; }; copilotNodePackage = mkOption { - type = with types; nullOr package; # TODO - maybe accept a path as well? imperative users might want to use something like nvm - default = pkgs.nodejs-slim; # this will likely need to be downgraded because Copilot does not stay up to date with NodeJS - description = "The package that will be used for Copilot. NodeJS v18 is recommended."; + type = with types; nullOr package; + default = pkgs.nodejs-slim; + description = '' + The nodeJS package that will be used for GitHub Copilot. If you are using a custom node command + you may want to set this option to null so that the package is not pulled from nixpkgs. + ''; }; }; } diff --git a/modules/completion/nvim-cmp/config.nix b/modules/completion/nvim-cmp/config.nix index e49fdb9..52e8972 100644 --- a/modules/completion/nvim-cmp/config.nix +++ b/modules/completion/nvim-cmp/config.nix @@ -49,6 +49,7 @@ in { "buffer" = "[Buffer]"; "crates" = "[Crates]"; "path" = "[Path]"; + "copilot" = "[Copilot]"; }; vim.maps.insert = mkMerge [