Skip to content

Commit

Permalink
plugins/copilot-lua: migrate to mkNeovimPlugin
Browse files Browse the repository at this point in the history
  • Loading branch information
HeitorAugustoLN committed Jan 7, 2025
1 parent a352bb8 commit a3d6a03
Show file tree
Hide file tree
Showing 6 changed files with 321 additions and 236 deletions.
2 changes: 1 addition & 1 deletion plugins/by-name/blink-cmp-copilot/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ lib.nixvim.plugins.mkNeovimPlugin {
extraConfig = {
warnings =
let
copilot-lua-cfg = config.plugins.copilot-lua;
copilot-lua-cfg = config.plugins.copilot-lua.settings;
isEnabled = b: builtins.isBool b && b;
in
lib.optionals (isEnabled copilot-lua-cfg.suggestion.enabled) [
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/copilot-cmp/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ lib.nixvim.plugins.mkNeovimPlugin {
extraConfig = {
warnings =
let
copilot-lua-cfg = config.plugins.copilot-lua;
copilot-lua-cfg = config.plugins.copilot-lua.settings;
isEnabled = b: (lib.isBool b && b);
in
lib.optional (isEnabled copilot-lua-cfg.suggestion.enabled) ''
Expand Down
326 changes: 140 additions & 186 deletions plugins/by-name/copilot-lua/default.nix
Original file line number Diff line number Diff line change
@@ -1,172 +1,164 @@
{
lib,
helpers,
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.plugins.copilot-lua;
inherit (lib) types;
inherit (lib.nixvim) defaultNullOpts;
in
{
options = {
plugins.copilot-lua =
let
keymapOption = helpers.defaultNullOpts.mkNullable (with types; either (enum [ false ]) str);
in
lib.nixvim.plugins.neovim.extraOptionsOptions
// {
enable = mkEnableOption "copilot.lua";

package = lib.mkPackageOption pkgs "copilot.lua" {
default = [
"vimPlugins"
"copilot-lua"
];
lib.nixvim.plugins.mkNeovimPlugin {
name = "copilot-lua";
moduleName = "copilot";
packPathName = "copilot.lua";

maintainers = [ lib.maintainers.HeitorAugustoLN ];

settingsOptions =
let
mkKeymapOption = defaultNullOpts.mkNullableWithRaw (with types; either (enum [ false ]) str);
in
{
panel = {
enabled = defaultNullOpts.mkBool true "Enable the panel.";
auto_refresh = defaultNullOpts.mkBool false "Enable auto-refresh.";

keymap = {
jump_prev = mkKeymapOption "[[" "Keymap for jumping to the previous suggestion.";
jump_next = mkKeymapOption "]]" "Keymap for jumping to the next suggestion.";
accept = mkKeymapOption "<CR>" "Keymap to accept the proposed suggestion.";
refresh = mkKeymapOption "gr" "Keymap to refresh the suggestions.";
open = mkKeymapOption "<M-CR>" "Keymap to open.";
};

panel = {
enabled = helpers.defaultNullOpts.mkBool true "Enable the panel.";

autoRefresh = helpers.defaultNullOpts.mkBool false "Enable auto-refresh.";

keymap = {
jumpPrev = keymapOption "[[" "Keymap for jumping to the previous suggestion.";

jumpNext = keymapOption "]]" "Keymap for jumping to the next suggestion.";

accept = keymapOption "<CR>" "Keymap to accept the proposed suggestion.";

refresh = keymapOption "gr" "Keymap to refresh the suggestions.";

open = keymapOption "<M-CR>" "Keymap to open.";
};

layout = {
position =
helpers.defaultNullOpts.mkEnumFirstDefault
[
"bottom"
"top"
"left"
"right"
]
''
The panel position.
'';

ratio = helpers.defaultNullOpts.mkProportion 0.4 ''
The panel ratio.
'';
};
layout = {
position =
defaultNullOpts.mkEnumFirstDefault
[
"bottom"
"top"
"left"
"right"
"horizontal"
"vertical"
]
''
The panel position.
'';

ratio = defaultNullOpts.mkProportion 0.4 ''
The panel ratio.
'';
};
};

suggestion = {
enabled = helpers.defaultNullOpts.mkBool true "Enable suggestion.";

autoTrigger = helpers.defaultNullOpts.mkBool false "Enable auto-trigger.";

debounce = helpers.defaultNullOpts.mkInt 75 "Debounce.";

keymap = {
accept = keymapOption "<M-l>" "Keymap for accepting the suggestion.";

acceptWord = keymapOption false "Keymap for accepting a word suggestion.";

acceptLine = keymapOption false "Keymap for accepting a line suggestion.";

next = keymapOption "<M-]>" "Keymap for accepting the next suggestion.";

prev = keymapOption "<M-[>" "Keymap for accepting the previous suggestion.";

dismiss = keymapOption "<C-]>" "Keymap to dismiss the suggestion.";
};
suggestion = {
enabled = defaultNullOpts.mkBool true "Enable suggestion.";
auto_trigger = defaultNullOpts.mkBool false "Enable auto-trigger.";
hide_during_completion = defaultNullOpts.mkBool true "Hide during completion.";
debounce = defaultNullOpts.mkInt 75 "Debounce.";

keymap = {
accept = mkKeymapOption "<M-l>" "Keymap for accepting the suggestion.";
accept_word = mkKeymapOption false "Keymap for accepting a word suggestion.";
accept_line = mkKeymapOption false "Keymap for accepting a line suggestion.";
next = mkKeymapOption "<M-]>" "Keymap for accepting the next suggestion.";
prev = mkKeymapOption "<M-[>" "Keymap for accepting the previous suggestion.";
dismiss = mkKeymapOption "<C-]>" "Keymap to dismiss the suggestion.";
};
};

filetypes =
helpers.defaultNullOpts.mkAttrsOf types.bool
{
yaml = false;
markdown = false;
help = false;
gitcommit = false;
gitrebase = false;
hgcommit = false;
svn = false;
cvs = false;
"." = false;
}
''
Specify filetypes for attaching copilot.
Each value can be either a boolean or a lua function that returns a boolean.
Example:
```nix
{
markdown = true; # overrides default
terraform = false; # disallow specific filetype
sh.__raw = \'\'
function ()
if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), '^%.env.*') then
-- disable for .env files
return false
end
return true
end
\'\';
}
```
The key `"*"` can be used to disable the default configuration.
Example:
```nix
{
javascript = true; # allow specific filetype
typescript = true; # allow specific filetype
"*" = false; # disable for all other filetypes and ignore default `filetypes`
}
```
'';

copilotNodeCommand = mkOption {
type = types.str;
default = "${pkgs.nodejs-18_x}/bin/node";
description = ''
Use this field to provide the path to a specific node version such as one installed by
`nvm`.
Node.js version must be 16.x or newer.
'';
filetypes = defaultNullOpts.mkAttrsOf' {
type = types.bool;
pluginDefault = {
yaml = true;
markdown = false;
help = false;
gitcommit = false;
gitrebase = false;
hgcommit = false;
svn = false;
cvs = false;
"." = false;
};
example = lib.literalExpression ''
{
markdown = true; # overrides default
terraform = false; # disallow specific filetype
sh.__raw = '''
function()
if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), '^%.env.*') then
-- disable for .env files
return false
end
return true
end
''';
javascript = true; # allow specific type
"*" = false; # disable for all other filetypes and ignore default filetypes
}
'';
description = ''
Specify filetypes for attaching copilot.
Each value can be either a boolean or a lua function that returns a boolean.
'';
};

serverOptsOverrides = helpers.defaultNullOpts.mkAttrsOf' {
type = types.anything;
pluginDefault = { };
description = ''
Override copilot lsp client `settings`.
The settings field is where you can set the values of the options defined in
https://github.com/zbirenbaum/copilot.lua/blob/master/SettingsOpts.md.
These options are specific to the copilot lsp and can be used to customize its behavior.
copilot_node_command = defaultNullOpts.mkStr' {
pluginDefault = "node";
example = lib.literalExpression "lib.getExe pkgs.nodejs";
description = ''
Define the node command to use for copilot-lua.
Ensure that the `name` field is not overridden as is is used for efficiency reasons in
numerous checks to verify copilot is actually running.
Node.js version must be 18.x or newer.
'';
};

See `:h vim.lsp.start_client` for list of options.
'';
example = {
trace = "verbose";
settings = {
advanced = {
listCount = 10; # number of completions for panel
inlineSuggestCount = 3; # number of completions for getCompletions
};
server_opts_overrides = defaultNullOpts.mkAttrsOf' {
type = types.anything;
pluginDefault = { };
description = ''
Override copilot lsp client `settings`.
The settings field is where you can set the values of the options defined in
https://github.com/zbirenbaum/copilot.lua/blob/master/SettingsOpts.md.
These options are specific to the copilot lsp and can be used to customize its behavior.
Ensure that the `name` field is not overridden as is is used for efficiency reasons in
numerous checks to verify copilot is actually running.
See `:h vim.lsp.start_client` for list of options.
'';
example = {
trace = "verbose";
settings = {
advanced = {
listCount = 10; # number of completions for panel
inlineSuggestCount = 3; # number of completions for getCompletions
};
};
};
};
};

settingsExample = {
panel = {
enabled = true;
auto_refresh = true;
};
suggestion = {
enabled = true;
auto_trigger = false;
hide_during_completion = false;
debounce = 90;
keymap = {
accept_word = false;
accept_line = false;
};
};
};

config = mkIf cfg.enable {
extraConfig = {
assertions = [
{
assertion = !config.plugins.copilot-vim.enable;
Expand All @@ -176,45 +168,7 @@ in
'';
}
];

extraPlugins = [ cfg.package ];

extraConfigLua =
let
setupOptions =
with cfg;
{
panel = with panel; {
inherit enabled;
auto_refresh = autoRefresh;
keymap = with keymap; {
jump_prev = jumpPrev;
jump_next = jumpNext;
inherit accept refresh open;
};
layout = with layout; {
inherit position ratio;
};
};
suggestion = with suggestion; {
inherit enabled;
auto_trigger = autoTrigger;
inherit debounce;
keymap = with keymap; {
inherit accept;
accept_word = acceptWord;
accept_line = acceptLine;
inherit next prev dismiss;
};
};
inherit filetypes;
copilot_node_command = copilotNodeCommand;
server_opts_overrides = serverOptsOverrides;
}
// cfg.extraOptions;
in
''
require('copilot').setup(${lib.nixvim.toLuaObject setupOptions})
'';
};

inherit (import ./deprecations.nix) deprecateExtraOptions optionsRenamedToSettings;
}
Loading

0 comments on commit a3d6a03

Please sign in to comment.