diff --git a/lib/neovim-plugin.nix b/lib/neovim-plugin.nix index be5c7bc4..250692a5 100644 --- a/lib/neovim-plugin.nix +++ b/lib/neovim-plugin.nix @@ -116,9 +116,9 @@ lazyLoad = lib.nixvim.mkLazyLoadOption { inherit originalName; - lazyLoadDefaults = ( - lib.optionalAttrs (isColorscheme && colorscheme != null) { inherit colorscheme; } - ); + lazyLoadDefaults = lib.optionalAttrs (isColorscheme && colorscheme != null) { + inherit colorscheme; + }; }; } // lib.optionalAttrs hasSettings { @@ -171,6 +171,34 @@ # Write the lua configuration `luaConfig.content` to the config file (lib.mkIf (!cfg.lazyLoad.enable) (setLuaConfig cfg.luaConfig.content)) ]) + ++ (lib.optionals hasConfigAttrs [ + (lib.mkIf (cfg.lazyLoad.backend == "lz.n") { + plugins.lz-n = { + # infinite recursion? + # enable = true; + plugins = [ + { + # TODO: handle this for every plugin properly + __unkeyed-1 = originalName; + # Use provided after, otherwise fallback to normal lua content + after = if cfg.lazyLoad.after != null then cfg.lazyLoad.after else cfg.luaConfig.content; + inherit (cfg.lazyLoad) + enabled + priority + before + beforeAll + event + cmd + ft + keys + colorscheme + extraSettings + ; + } + ]; + }; + }) + ]) ) ); }; diff --git a/lib/options.nix b/lib/options.nix index 1e4cafe5..2ee3e194 100644 --- a/lib/options.nix +++ b/lib/options.nix @@ -360,6 +360,15 @@ rec { lazy-loading for ${originalName} ''; + backend = + mkEnumFirstDefault + [ + "lz.n" + ] + '' + The lazy-loading backend to use. + ''; + # Spec loading: enabled = mkStrLuaFnOr types.bool (lazyLoadDefaults.enabledInSpec or null) '' When false, or if the function returns false, then ${originalName} will not be included in the spec. diff --git a/tests/test-sources/plugins/lazy-load.nix b/tests/test-sources/plugins/lazy-load.nix index 24dc6140..0044a5c7 100644 --- a/tests/test-sources/plugins/lazy-load.nix +++ b/tests/test-sources/plugins/lazy-load.nix @@ -1,34 +1,129 @@ { - lazy-load-plugin = + lazy-load-neovim-plugin = { config, ... }: { plugins = { lz-n = { enable = true; - plugins = [ - { - __unkeyed-1 = "neotest"; - after.__raw = '' - function() - ${config.plugins.neotest.luaConfig.content} - end - ''; - keys = [ - { - __unkeyed-1 = "nt"; - __unkeyed-3 = "Neotest summary"; - desc = "Summary toggle"; - } - ]; - - } - ]; }; neotest = { enable = true; - lazyLoad.enable = true; + lazyLoad = { + enable = true; + keys = [ + { + __unkeyed-1 = "nt"; + __unkeyed-3 = "Neotest summary"; + desc = "Summary toggle"; + } + ]; + }; }; }; + + assertions = [ + { + assertion = (builtins.length config.plugins.lz-n.plugins) == 1; + message = "`lz-n.plugins` should have contained a single plugin configuration, but contained ${builtins.toJSON config.plugins.lz-n.plugins}"; + } + { + assertion = + let + plugin = builtins.head config.plugins.lz-n.plugins; + keys = if builtins.isList plugin.keys then plugin.keys else [ ]; + in + (builtins.length keys) == 1; + message = "`lz-n.plugins[0].keys` should have contained a configuration."; + } + ]; + }; + + lazy-load-lz-n = + { config, ... }: + { + plugins = { + codesnap = { + enable = true; + lazyLoad.enable = true; + }; + lz-n = { + enable = true; + plugins = [ + { + __unkeyed-1 = "codesnap"; + after.__raw = '' + function() + ${config.plugins.codesnap.luaConfig.content} + end + ''; + cmd = [ + "CodeSnap" + "CodeSnapSave" + "CodeSnapHighlight" + "CodeSnapSaveHighlight" + ]; + keys = [ + { + __unkeyed-1 = "cc"; + __unkeyed-3 = "CodeSnap"; + desc = "Copy"; + mode = "v"; + } + { + __unkeyed-1 = "cs"; + __unkeyed-3 = "CodeSnapSave"; + desc = "Save"; + mode = "v"; + } + { + __unkeyed-1 = "ch"; + __unkeyed-3 = "CodeSnapHighlight"; + desc = "Highlight"; + mode = "v"; + } + { + __unkeyed-1 = "cH"; + __unkeyed-3 = "CodeSnapSaveHighlight"; + desc = "Save Highlight"; + mode = "v"; + } + ]; + } + ]; + }; + }; + assertions = [ + { + assertion = (builtins.length config.plugins.lz-n.plugins) == 1; + message = "`lz-n.plugins` should have contained a single plugin configuration, but contained ${builtins.toJSON config.plugins.lz-n.plugins}"; + } + { + assertion = + let + plugin = builtins.head config.plugins.lz-n.plugins; + keys = if builtins.isList plugin.keys then plugin.keys else [ ]; + in + (builtins.length keys) == 4; + message = + let + plugin = builtins.head config.plugins.lz-n.plugins; + in + "`lz-n.plugins[0].keys` should have contained 4 key configurations, but contained ${builtins.toJSON (plugin.keys)}"; + } + { + assertion = + let + plugin = builtins.head config.plugins.lz-n.plugins; + cmd = if builtins.isList plugin.cmd then plugin.cmd else [ ]; + in + (builtins.length cmd) == 4; + message = + let + plugin = builtins.head config.plugins.lz-n.plugins; + in + "`lz-n.plugins[0].cmd` should have contained 4 cmd configurations, but contained ${builtins.toJSON (plugin.cmd)}"; + } + ]; }; }