{ pkgs, config, lib, ... }: with lib; with builtins; let cfg = config.vim.assistant.copilot; in { options.vim.assistant.copilot = { enable = mkEnableOption "GitHub Copilot AI assistant"; panel = { position = mkOption { type = types.enum [ "bottom" "top" "left" "right" ]; default = "bottom"; description = "Panel position"; }; ratio = mkOption { type = types.float; default = 0.4; description = "Panel size"; }; }; mappings = { panel = { jumpPrev = mkOption { type = types.nullOr types.str; default = "[["; description = "Jump to previous suggestion"; }; jumpNext = mkOption { type = types.nullOr types.str; default = "]]"; description = "Jump to next suggestion"; }; accept = mkOption { type = types.nullOr types.str; default = "<CR>"; description = "Accept suggestion"; }; refresh = mkOption { type = types.nullOr types.str; default = "gr"; description = "Refresh suggestions"; }; open = mkOption { type = types.nullOr types.str; default = "<M-CR>"; description = "Open suggestions"; }; }; suggestion = { accept = mkOption { type = types.nullOr types.str; default = "<M-l>"; description = "Accept suggetion"; }; acceptWord = mkOption { type = types.nullOr types.str; default = null; description = "Accept next word"; }; acceptLine = mkOption { type = types.nullOr types.str; default = null; description = "Accept next line"; }; prev = mkOption { type = types.nullOr types.str; default = "<M-[>"; description = "Previous suggestion"; }; next = mkOption { type = types.nullOr types.str; default = "<M-]>"; description = "Next suggestion"; }; dismiss = mkOption { type = types.nullOr types.str; default = "<C-]>"; description = "Dismiss suggestion"; }; }; }; copilot_node_command = mkOption { type = types.str; default = "${lib.getExe cfg.copilotNodePackage}"; description = "Path to nodejs"; }; 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."; }; }; }