diff --git a/plugins/by-name/alpha/default.nix b/plugins/by-name/alpha/default.nix index 424d1a5ed1..6197770f65 100644 --- a/plugins/by-name/alpha/default.nix +++ b/plugins/by-name/alpha/default.nix @@ -1,86 +1,74 @@ -{ - lib, - config, - options, - pkgs, - ... -}: +{ lib, ... }: let - inherit (lib) types mkOption; - - cfg = config.plugins.alpha; - - sectionType = types.submodule { - freeformType = with types; attrsOf anything; - options = { - type = mkOption { - type = types.enum [ - "button" - "group" - "padding" - "text" - "terminal" - ]; - description = "Type of section"; - }; - - val = lib.nixvim.mkNullOrOption ( - with types; - nullOr (oneOf [ - - # "button", "text" - (maybeRaw str) - # "padding" - int - (listOf ( - either - # "text" (list of strings) - str - # "group" - (attrsOf anything) - )) - ]) - ) "Value for section"; - - opts = mkOption { - type = with types; attrsOf anything; - default = { }; - description = "Additional options for the section"; - }; - }; - }; + inherit (lib) mkOption types; + inherit (lib.nixvim) + defaultNullOpts + mkAssertions + mkRaw + nestedLiteralLua + toLuaObject + ; in -{ - options = { - plugins.alpha = { - enable = lib.mkEnableOption "alpha-nvim"; - - package = lib.mkPackageOption pkgs "alpha-nvim" { - default = [ - "vimPlugins" - "alpha-nvim" - ]; - }; - - # TODO: deprecated 2024-08-29 remove after 24.11 - iconsEnabled = mkOption { - type = types.bool; - description = "Toggle icon support. Installs nvim-web-devicons."; - visible = false; - }; +lib.nixvim.plugins.mkNeovimPlugin { + name = "alpha"; + packPathName = "alpha-nvim"; + package = "alpha-nvim"; + + maintainers = [ lib.maintainers.HeitorAugustoLN ]; + + callSetup = false; + + settingsOptions = { + layout = + let + sectionType = types.submodule { + freeformType = with types; attrsOf anything; + options = { + type = mkOption { + type = types.enum [ + "button" + "group" + "padding" + "text" + "terminal" + ]; + example = "button"; + description = '' + The type of the section. + ''; + }; - theme = mkOption { - type = with types; nullOr (maybeRaw str); - apply = v: if lib.isString v then lib.nixvim.mkRaw "require'alpha.themes.${v}'.config" else v; - default = null; - example = "dashboard"; - description = "You can directly use a pre-defined theme."; - }; + val = defaultNullOpts.mkNullableWithRaw' { + type = + with types; + oneOf [ + # button || text + (maybeRaw str) + # padding + int + (listOf ( + either str # text (list of strings) + (attrsOf anything) # group + )) + ]; + example = "Some text"; + description = '' + The value for the section. + ''; + }; - layout = mkOption { - type = with types; either (maybeRaw str) (listOf sectionType); - default = [ ]; - description = "List of sections to layout for the dashboard"; + opts = mkOption { + type = with types; attrsOf anything; + default = { }; + description = '' + Additional options for the section. + ''; + }; + }; + }; + in + defaultNullOpts.mkNullableWithRaw' { + type = with types; either str (listOf sectionType); example = [ { type = "padding"; @@ -135,57 +123,108 @@ in }; } ]; + description = '' + List of sections to layout for the dashboard + ''; }; - opts = lib.nixvim.mkNullOrOption (with types; attrsOf anything) '' + opts = defaultNullOpts.mkAttrsOf' { + type = types.anything; + description = '' Optional global options. ''; }; }; - config = - let - layoutDefined = cfg.layout != [ ]; - themeDefined = cfg.theme != null; - - opt = options.plugins.alpha; - in - lib.mkIf cfg.enable { - - # TODO: added 2024-09-20 remove after 24.11 - warnings = lib.nixvim.mkWarnings "plugins.alpha" { - when = opt.iconsEnabled.isDefined; - message = '' - The option definition `plugins.alpha.iconsEnabled' in ${lib.showFiles opt.iconsEnabled.files} has been deprecated; please remove it. - ''; - }; - - plugins.web-devicons = - lib.mkIf - ( - opt.iconsEnabled.isDefined - && cfg.iconsEnabled - && !( - config.plugins.mini.enable - && config.plugins.mini.modules ? icons - && config.plugins.mini.mockDevIcons - ) - ) + settingsExample = { + layout = [ + { + type = "padding"; + val = 2; + } + { + type = "text"; + val = [ + "███╗ ██╗██╗██╗ ██╗██╗ ██╗██╗███╗ ███╗" + "████╗ ██║██║╚██╗██╔╝██║ ██║██║████╗ ████║" + "██╔██╗ ██║██║ ╚███╔╝ ██║ ██║██║██╔████╔██║" + "██║╚██╗██║██║ ██╔██╗ ╚██╗ ██╔╝██║██║╚██╔╝██║" + "██║ ╚████║██║██╔╝ ██╗ ╚████╔╝ ██║██║ ╚═╝ ██║" + "╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝" + ]; + opts = { + position = "center"; + hl = "Type"; + }; + } + { + type = "padding"; + val = 2; + } + { + type = "group"; + val = [ { - enable = lib.mkOverride 1490 true; - }; + type = "button"; + val = " New file"; + on_press = nestedLiteralLua "function() vim.cmd[[ene]] end"; + opts.shortcut = "n"; + } + { + type = "button"; + val = " Quit Neovim"; + on_press = nestedLiteralLua "function() vim.cmd[[qa]] end"; + opts.shortcut = "q"; + } + ]; + } + { + type = "padding"; + val = 2; + } + { + type = "text"; + val = "Inspiring quote here."; + opts = { + position = "center"; + hl = "Keyword"; + }; + } + ]; + }; + + extraOptions = { + theme = defaultNullOpts.mkStr' { + description = '' + The theme to use for the dashboard. + ''; + example = "dashboard"; + apply = + value: if builtins.isString value then mkRaw ''require("alpha.themes.${value}").config'' else value; + }; + }; - extraPlugins = [ cfg.package ]; + optionsRenamedToSettings = [ + "opts" + "layout" + ]; - assertions = lib.nixvim.mkAssertions "plugins.alpha" [ + extraConfig = + cfg: + let + layoutDefined = cfg.settings.layout != null; + themeDefined = cfg.theme != null; + in + { + assertions = mkAssertions "plugins.alpha" [ { - assertion = themeDefined || layoutDefined; + assertion = layoutDefined || themeDefined; message = '' You have to either set a `theme` or define some sections in `layout`. ''; } { - assertion = !(themeDefined && layoutDefined); + assertion = !(themeDefined && toLuaObject cfg.settings != "{}"); message = '' 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. @@ -193,19 +232,9 @@ in } ]; - extraConfigLua = - let - setupOptions = - if themeDefined then - cfg.theme - else - (with cfg; { - inherit layout opts; - }); - in - '' - require('alpha').setup(${lib.nixvim.toLuaObject setupOptions}) - require('alpha.term') - ''; + plugins.alpha.luaConfig.content = '' + require('alpha').setup(${toLuaObject (if themeDefined then cfg.theme else cfg.settings)}); + require('alpha.term') + ''; }; }