wrapper/lazy: allow conditionally calling setup() for plugins

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I644a46924f6a7fbb46e507d2599f03b06a6a6964
This commit is contained in:
raf 2026-06-20 02:01:33 +03:00
commit bf7fd28d79
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
2 changed files with 60 additions and 18 deletions

View file

@ -29,7 +29,7 @@
then spec.package.pname then spec.package.pname
else spec.package.name; else spec.package.name;
in in
(removeAttrs spec ["package" "setupModule" "setupOpts" "keys"]) (removeAttrs spec ["package" "setupModule" "setupOpts" "setupCond" "keys"])
// { // {
"@1" = "@1" =
if spec.package != null && packageName != name && spec.load == null if spec.package != null && packageName != name && spec.load == null
@ -73,14 +73,20 @@
after = after =
if spec.setupModule == null && spec.after == null if spec.setupModule == null && spec.after == null
then null then null
else else let
setupCall = "require(${toJSON spec.setupModule}).setup(${toLuaObject spec.setupOpts})";
conditionalSetup =
if spec.setupCond != null
then ''
if (${spec.setupCond}) then
${setupCall}
end''
else setupCall;
in
mkLuaInline '' mkLuaInline ''
function() function()
${optionalString (spec.beforeSetup != null) spec.beforeSetup} ${optionalString (spec.beforeSetup != null) spec.beforeSetup}
${ ${optionalString (spec.setupModule != null) conditionalSetup}
optionalString (spec.setupModule != null)
"require(${toJSON spec.setupModule}).setup(${toLuaObject spec.setupOpts})"
}
${optionalString (spec.after != null) spec.after} ${optionalString (spec.after != null) spec.after}
end end
''; '';
@ -105,11 +111,19 @@
pluginPackages = filter (x: x != null) (mapAttrsToList (_: plugin: plugin.package) cfg.plugins); pluginPackages = filter (x: x != null) (mapAttrsToList (_: plugin: plugin.package) cfg.plugins);
specToNotLazyConfig = _: spec: '' specToNotLazyConfig = _: spec: let
setupCall = "require(${toJSON spec.setupModule}).setup(${toLuaObject spec.setupOpts})";
conditionalSetup =
if spec.setupCond != null
then ''
if (${spec.setupCond}) then
${setupCall}
end''
else setupCall;
in ''
do do
${optionalString (spec.before != null) spec.before} ${optionalString (spec.before != null) spec.before}
${optionalString (spec.setupModule != null) ${optionalString (spec.setupModule != null) conditionalSetup}
"require(${toJSON spec.setupModule}).setup(${toLuaObject spec.setupOpts})"}
${optionalString (spec.after != null) spec.after} ${optionalString (spec.after != null) spec.after}
end end
''; '';

View file

@ -16,9 +16,10 @@
default = null; default = null;
description = "Action to trigger."; description = "Action to trigger.";
}; };
lua = mkBool false '' lua = mkBool false ''
If true, `action` is considered to be lua code. If true, `action` is considered to be lua code. Thus, it will not be
Thus, it will not be wrapped in `""`. wrapped in `""`.
''; '';
desc = mkOption { desc = mkOption {
@ -70,7 +71,7 @@
description = '' description = ''
Plugin package. Plugin package.
If null, a custom load function must be provided If `null`, a custom load function must be provided
''; '';
}; };
@ -90,29 +91,56 @@
}; };
setupOpts = mkOption { setupOpts = mkOption {
type = attrsOf anything; type = either (attrsOf anything) luaInline;
default = {}; default = {};
description = "Options to pass to the setup function"; description = ''
Options to pass to the setup function.
Accepts either an attribute set or a raw Lua expression via
`lib.mkLuaInline`. When set to a `luaInline` value, the expression
is passed verbatim as the argument to `setup()`.
'';
};
setupCond = mkOption {
type = nullOr lines;
default = null;
description = ''
A Lua expression used as the condition for calling setup. When set,
the setup call is wrapped as `if (condition) then ... end`, allowing
runtime-conditional plugin initialization.
For example, `"not vim.g.vscode"` will only call setup when not running
inside VSCode with vscode-neovim.
'';
}; };
# lz.n options # lz.n options
enabled = mkOption { enabled = mkOption {
type = nullOr (either bool luaInline); type = nullOr (either bool luaInline);
default = null; default = null;
description = "When false, or if the lua function returns false, this plugin will not be included in the spec"; description = ''
When `false`, or if the Lua function returns false, this plugin will
not be included in the spec.
'';
}; };
beforeAll = mkOption { beforeAll = mkOption {
type = nullOr lines; type = nullOr lines;
default = null; default = null;
description = "Lua code to run before any plugins are loaded. This will be wrapped in a function."; description = ''
Lua code to run before any plugins are loaded. This will be wrapped
in a function.
'';
}; };
before = mkOption { before = mkOption {
type = nullOr lines; type = nullOr lines;
default = null; default = null;
description = "Lua code to run before plugin is loaded. This will be wrapped in a function."; description = ''
Lua code to run before plugin is loaded. This will be wrapped in a
function.
'';
}; };
after = mkOption { after = mkOption {