nix-community.nixvim/plugins/utils/alpha.nix

177 lines
4.9 KiB
Nix
Raw Normal View History

{
lib,
helpers,
config,
pkgs,
...
}:
2024-05-05 19:39:35 +02:00
with lib;
let
cfg = config.plugins.alpha;
2024-01-12 23:13:04 +01:00
sectionType = types.submodule {
freeformType = with types; attrsOf anything;
options = {
type = mkOption {
type = types.enum [
"button"
"group"
"padding"
"text"
"terminal"
];
description = "Type of section";
};
2024-05-05 19:39:35 +02:00
val = helpers.mkNullOrOption (
with helpers.nixvimTypes;
nullOr (oneOf [
# "button", "text"
str
# "padding"
int
(listOf (
either
2024-01-12 23:13:04 +01:00
# "text" (list of strings)
str
# "group"
(attrsOf anything)
2024-05-05 19:39:35 +02:00
))
])
) "Value for section";
2024-01-12 23:13:04 +01:00
opts = mkOption {
type = with types; attrsOf anything;
2024-05-05 19:39:35 +02:00
default = { };
2024-01-12 23:13:04 +01:00
description = "Additional options for the section";
};
};
2024-01-12 23:13:04 +01:00
};
2024-05-05 19:39:35 +02:00
in
{
options = {
plugins.alpha = {
2024-01-12 23:13:04 +01:00
enable = mkEnableOption "alpha-nvim";
package = helpers.mkPluginPackageOption "alpha-nvim" pkgs.vimPlugins.alpha-nvim;
iconsEnabled = mkOption {
type = types.bool;
description = "Toggle icon support. Installs nvim-web-devicons.";
default = true;
};
2024-01-12 23:13:04 +01:00
theme = mkOption {
type = with helpers.nixvimTypes; nullOr (maybeRaw str);
2024-05-05 19:39:35 +02:00
apply = v: if isString v then helpers.mkRaw "require'alpha.themes.${v}'.config" else v;
2024-01-12 23:13:04 +01:00
default = null;
example = "dashboard";
description = "You can directly use a pre-defined theme.";
};
layout = mkOption {
2024-01-12 23:13:04 +01:00
type = types.listOf sectionType;
2024-05-05 19:39:35 +02:00
default = [ ];
2024-01-12 23:13:04 +01:00
description = "List of sections to layout for the dashboard";
example = [
{
type = "padding";
val = 2;
}
{
type = "text";
val = [
2024-01-12 23:13:04 +01:00
" "
" "
" "
" "
" "
" "
];
opts = {
position = "center";
hl = "Type";
};
}
{
type = "padding";
val = 2;
}
{
type = "group";
val = [
{
type = "button";
2024-01-16 00:02:22 +01:00
val = " New file";
on_press.__raw = "function() vim.cmd[[ene]] end";
opts.shortcut = "n";
}
{
type = "button";
2024-01-16 00:02:22 +01:00
val = " Quit Neovim";
on_press.__raw = "function() vim.cmd[[qa]] end";
opts.shortcut = "q";
}
];
}
{
type = "padding";
val = 2;
}
{
type = "text";
val = "Inspiring quote here.";
opts = {
position = "center";
hl = "Keyword";
};
}
];
};
2024-01-12 23:13:04 +01:00
opts = helpers.mkNullOrOption (with types; attrsOf anything) ''
Optional global options.
'';
};
};
2024-05-05 19:39:35 +02:00
config =
let
layoutDefined = cfg.layout != [ ];
themeDefined = cfg.theme != null;
in
mkIf cfg.enable {
2024-05-05 19:39:35 +02:00
extraPlugins = [ cfg.package ] ++ (optional cfg.iconsEnabled pkgs.vimPlugins.nvim-web-devicons);
2024-01-12 23:13:04 +01:00
assertions = [
{
assertion = themeDefined || layoutDefined;
message = ''
Nixvim (plugins.alpha): You have to either set a `theme` or define some sections in `layout`.
'';
}
{
assertion = !(themeDefined && layoutDefined);
message = ''
Nixvim (plugins.alpha): You can't define both a `theme` and custom options.
Set `plugins.alpha.theme = null` if you want to configure alpha manually using the `layout` option.
'';
}
2024-01-12 23:13:04 +01:00
];
2024-05-05 19:39:35 +02:00
extraConfigLua =
let
setupOptions =
if themeDefined then
cfg.theme
else
(with cfg; {
inherit layout opts;
});
in
''
require('alpha').setup(${helpers.toLuaObject setupOptions})
'';
};
}