2024-04-08 02:28:49 +02:00
|
|
|
{
|
|
|
|
inputs,
|
|
|
|
lib,
|
|
|
|
...
|
|
|
|
}: let
|
|
|
|
inherit (lib.options) mkOption;
|
|
|
|
inherit (lib.attrsets) attrNames mapAttrs' filterAttrs nameValuePair;
|
2024-07-08 23:57:58 +02:00
|
|
|
inherit (lib.strings) hasPrefix removePrefix;
|
2024-08-01 22:33:51 +02:00
|
|
|
inherit (lib.types) submodule either package enum str lines attrsOf anything listOf nullOr oneOf bool;
|
2024-04-08 02:28:49 +02:00
|
|
|
# Get the names of all flake inputs that start with the given prefix.
|
2024-04-09 08:55:45 +02:00
|
|
|
fromInputs = {
|
|
|
|
inputs,
|
|
|
|
prefix,
|
|
|
|
}:
|
2024-04-08 02:28:49 +02:00
|
|
|
mapAttrs' (n: v: nameValuePair (removePrefix prefix n) {src = v;}) (filterAttrs (n: _: hasPrefix prefix n) inputs);
|
|
|
|
|
|
|
|
# Get the names of all flake inputs that start with the given prefix.
|
2024-04-09 08:55:45 +02:00
|
|
|
pluginInputNames = attrNames (fromInputs {
|
|
|
|
inherit inputs;
|
|
|
|
prefix = "plugin-";
|
|
|
|
});
|
2024-04-08 02:28:49 +02:00
|
|
|
|
2023-02-06 19:57:35 +01:00
|
|
|
# You can either use the name of the plugin or a package.
|
2024-04-08 02:28:49 +02:00
|
|
|
pluginType = nullOr (
|
|
|
|
either
|
|
|
|
package
|
2024-04-09 08:55:45 +02:00
|
|
|
(enum (pluginInputNames ++ ["nvim-treesitter" "flutter-tools-patched" "vim-repeat"]))
|
2024-04-08 02:28:49 +02:00
|
|
|
);
|
2023-07-18 21:21:36 +02:00
|
|
|
|
2024-04-08 02:28:49 +02:00
|
|
|
pluginsType = listOf pluginType;
|
2023-07-21 15:30:03 +02:00
|
|
|
|
2024-04-08 02:28:49 +02:00
|
|
|
extraPluginType = submodule {
|
|
|
|
options = {
|
|
|
|
package = mkOption {
|
|
|
|
type = pluginType;
|
|
|
|
description = "Plugin Package.";
|
|
|
|
};
|
2024-02-17 01:19:38 +01:00
|
|
|
|
2024-04-08 02:28:49 +02:00
|
|
|
after = mkOption {
|
|
|
|
type = listOf str;
|
|
|
|
default = [];
|
|
|
|
description = "Setup this plugin after the following ones.";
|
|
|
|
};
|
2024-02-17 01:19:38 +01:00
|
|
|
|
2024-04-08 02:28:49 +02:00
|
|
|
setup = mkOption {
|
|
|
|
type = lines;
|
|
|
|
default = "";
|
|
|
|
description = "Lua code to run during setup.";
|
|
|
|
example = "require('aerial').setup {}";
|
2023-07-18 21:21:36 +02:00
|
|
|
};
|
|
|
|
};
|
2024-04-08 02:28:49 +02:00
|
|
|
};
|
2024-06-25 17:47:33 +02:00
|
|
|
|
|
|
|
luaInline = lib.mkOptionType {
|
|
|
|
name = "luaInline";
|
|
|
|
check = x: lib.nvim.lua.isLuaInline x;
|
|
|
|
};
|
|
|
|
|
2024-08-01 22:33:51 +02:00
|
|
|
lznKeysSpec = submodule {
|
|
|
|
options = {
|
|
|
|
desc = mkOption {
|
|
|
|
description = "Description of the key map";
|
|
|
|
type = nullOr str;
|
|
|
|
default = null;
|
|
|
|
};
|
|
|
|
|
|
|
|
noremap = mkOption {
|
|
|
|
description = "TBD";
|
|
|
|
type = bool;
|
|
|
|
default = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
expr = mkOption {
|
|
|
|
description = "TBD";
|
|
|
|
type = bool;
|
|
|
|
default = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
nowait = mkOption {
|
|
|
|
description = "TBD";
|
|
|
|
type = bool;
|
|
|
|
default = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
ft = mkOption {
|
|
|
|
description = "TBD";
|
|
|
|
type = nullOr (listOf str);
|
|
|
|
default = null;
|
|
|
|
};
|
|
|
|
|
|
|
|
lhs = mkOption {
|
|
|
|
type = str;
|
|
|
|
description = "Key to bind to";
|
|
|
|
};
|
|
|
|
|
|
|
|
rhs = mkOption {
|
|
|
|
type = nullOr str;
|
|
|
|
default = null;
|
|
|
|
description = "Action to trigger";
|
|
|
|
};
|
|
|
|
|
|
|
|
mode = mkOption {
|
|
|
|
description = "Modes to bind in";
|
|
|
|
type = listOf str;
|
2024-08-02 13:10:20 +02:00
|
|
|
default = ["n" "x" "s" "o"];
|
2024-08-01 22:33:51 +02:00
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2024-07-10 01:40:11 +02:00
|
|
|
lznPluginTableType = attrsOf lznPluginType;
|
2024-06-25 17:47:33 +02:00
|
|
|
lznPluginType = submodule {
|
|
|
|
options = {
|
|
|
|
## Should probably infer from the actual plugin somehow
|
|
|
|
## In general this is the name passed to packadd, so the dir name of the plugin
|
|
|
|
# name = mkOption {
|
|
|
|
# type= str;
|
|
|
|
# }
|
|
|
|
|
2024-07-24 12:52:47 +02:00
|
|
|
# Non-lz.n options
|
|
|
|
|
2024-07-10 01:40:11 +02:00
|
|
|
package = mkOption {
|
|
|
|
type = pluginType;
|
2024-07-24 12:52:47 +02:00
|
|
|
description = "Plugin package";
|
|
|
|
};
|
|
|
|
|
|
|
|
setupModule = mkOption {
|
|
|
|
type = nullOr str;
|
|
|
|
description = "Lua module to run setup function on.";
|
|
|
|
default = null;
|
2024-07-10 01:40:11 +02:00
|
|
|
};
|
2024-06-25 17:47:33 +02:00
|
|
|
|
2024-07-24 12:52:47 +02:00
|
|
|
setupOpts = mkOption {
|
|
|
|
type = submodule {freeformType = attrsOf anything;};
|
|
|
|
description = "Options to pass to the setup function";
|
|
|
|
default = {};
|
|
|
|
};
|
|
|
|
|
|
|
|
# lz.n options
|
|
|
|
|
2024-06-25 17:47:33 +02:00
|
|
|
before = mkOption {
|
|
|
|
type = nullOr luaInline;
|
|
|
|
description = "Code to run before plugin is loaded";
|
|
|
|
default = null;
|
|
|
|
};
|
|
|
|
|
|
|
|
after = mkOption {
|
|
|
|
type = nullOr luaInline;
|
|
|
|
description = "Code to run after plugin is loaded";
|
|
|
|
default = null;
|
|
|
|
};
|
|
|
|
|
|
|
|
event = mkOption {
|
|
|
|
description = "Lazy-load on event";
|
2024-07-10 01:40:11 +02:00
|
|
|
default = null;
|
2024-06-25 17:47:33 +02:00
|
|
|
type = let
|
|
|
|
event = submodule {
|
|
|
|
options = {
|
|
|
|
event = mkOption {
|
|
|
|
type = nullOr (either str (listOf str));
|
|
|
|
description = "Exact event name";
|
|
|
|
example = "BufEnter";
|
|
|
|
};
|
|
|
|
pattern = mkOption {
|
|
|
|
type = nullOr (either str (listOf str));
|
|
|
|
description = "Event pattern";
|
|
|
|
example = "BufEnter *.lua";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
in
|
2024-07-10 01:40:11 +02:00
|
|
|
nullOr (oneOf [str (listOf str) event]);
|
2024-06-25 17:47:33 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
cmd = mkOption {
|
|
|
|
description = "Lazy-load on command";
|
|
|
|
default = null;
|
|
|
|
type = nullOr (either str (listOf str));
|
|
|
|
};
|
|
|
|
|
|
|
|
ft = mkOption {
|
|
|
|
description = "Lazy-load on filetype";
|
|
|
|
default = null;
|
|
|
|
type = nullOr (either str (listOf str));
|
|
|
|
};
|
|
|
|
|
|
|
|
keys = mkOption {
|
|
|
|
description = "Lazy-load on key mapping";
|
|
|
|
default = null;
|
2024-08-02 13:10:20 +02:00
|
|
|
type = nullOr (oneOf [str (listOf lznKeysSpec) (listOf str)]); # TODO: support lz.n.KeysSpec
|
2024-06-25 17:47:33 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
# TODO: enabled, beforeAll, colorscheme, priority, load
|
|
|
|
};
|
|
|
|
};
|
2023-02-06 19:57:35 +01:00
|
|
|
in {
|
2024-07-10 01:40:11 +02:00
|
|
|
inherit extraPluginType fromInputs pluginType luaInline lznPluginType lznPluginTableType;
|
2023-07-18 21:21:36 +02:00
|
|
|
|
2023-02-06 19:57:35 +01:00
|
|
|
pluginsOpt = {
|
|
|
|
description,
|
2024-04-20 17:08:07 +02:00
|
|
|
example,
|
2023-02-06 19:57:35 +01:00
|
|
|
default ? [],
|
|
|
|
}:
|
|
|
|
mkOption {
|
2024-04-20 17:08:07 +02:00
|
|
|
inherit example description default;
|
2023-02-06 19:57:35 +01:00
|
|
|
type = pluginsType;
|
|
|
|
};
|
2024-01-03 00:54:49 +01:00
|
|
|
|
2024-04-08 02:28:49 +02:00
|
|
|
/*
|
|
|
|
opts is a attrset of options, example:
|
|
|
|
```
|
|
|
|
mkPluginSetupOption "telescope" {
|
|
|
|
file_ignore_patterns = mkOption {
|
|
|
|
description = "...";
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default = [];
|
|
|
|
};
|
|
|
|
layout_config.horizontal = mkOption {...};
|
|
|
|
}
|
|
|
|
```
|
|
|
|
*/
|
2024-01-03 00:54:49 +01:00
|
|
|
mkPluginSetupOption = pluginName: opts:
|
|
|
|
mkOption {
|
2024-04-20 14:24:00 +02:00
|
|
|
description = ''
|
2024-04-20 15:48:15 +02:00
|
|
|
Option table to pass into the setup function of ${pluginName}
|
2024-04-20 14:24:00 +02:00
|
|
|
|
|
|
|
You can pass in any additional options even if they're
|
2024-04-20 15:48:15 +02:00
|
|
|
not listed in the docs
|
2024-04-20 14:24:00 +02:00
|
|
|
'';
|
|
|
|
|
2024-01-03 00:54:49 +01:00
|
|
|
default = {};
|
2024-04-08 02:28:49 +02:00
|
|
|
type = submodule {
|
|
|
|
freeformType = attrsOf anything;
|
2024-01-03 00:54:49 +01:00
|
|
|
options = opts;
|
|
|
|
};
|
|
|
|
};
|
2023-02-06 19:57:35 +01:00
|
|
|
}
|