hyprland: support lua variables in settings

This commit is contained in:
Austin Horstman
2026-05-17 22:30:02 -05:00
parent d918d22422
commit 1bc2cf3eed
3 changed files with 52 additions and 9 deletions

View File

@@ -218,12 +218,19 @@ in
one call per element.
Attribute values with an `_args` list generate multi-argument calls.
Attribute values with `_var` generate a Lua local variable instead of
an `hl.<name>(...)` call. If no `name` is set, the attribute name is
used as the Lua variable name.
Values created with `lib.generators.mkLuaInline` are rendered as raw
Lua expressions.
'';
example = lib.literalExpression ''
{
mod = {
_var = "SUPER";
};
config = {
general = {
gaps_in = 5;
@@ -239,7 +246,7 @@ in
bind = [
{
_args = [
"SUPER + Q"
(lib.generators.mkLuaInline "mod .. \" + Q\"")
(lib.generators.mkLuaInline "hl.dsp.window.close()")
{ locked = true; }
];
@@ -541,18 +548,32 @@ in
renderSettings =
let
names = lib.sort lib.lessThan (lib.attrNames cfg.settings);
luaLocalNames = builtins.filter (
name: lib.isAttrs cfg.settings.${name} && cfg.settings.${name} ? _var
) names;
settingNames = builtins.filter (name: !(builtins.elem name luaLocalNames)) names;
importantNames = lib.unique (
lib.concatMap (
prefix: builtins.filter (name: lib.hasPrefix prefix name) names
prefix: builtins.filter (name: lib.hasPrefix prefix name) settingNames
) cfg.importantPrefixes
);
orderedNames = importantNames ++ builtins.filter (name: !(builtins.elem name importantNames)) names;
orderedNames =
importantNames ++ builtins.filter (name: !(builtins.elem name importantNames)) settingNames;
renderLocal =
name:
let
value = cfg.settings.${name};
in
"local ${value.name or name} = ${renderArgs value._var}\n";
renderCall = name: value: "hl.${name}(${renderArgs value})\n";
renderCalls =
name: value:
lib.concatMapStrings (renderCall name) (if builtins.isList value then value else [ value ]);
in
lib.concatMapStrings (
lib.optionalString (luaLocalNames != [ ]) (
renderSection "settings.locals" (lib.concatMapStrings renderLocal luaLocalNames)
)
+ lib.concatMapStrings (
name: renderSection "settings.${name}" (renderCalls name cfg.settings.${name})
) orderedNames;

View File

@@ -1,6 +1,10 @@
-- Generated by Home Manager.
-- See https://wiki.hypr.land/Configuring/Start/
-- settings.locals
local mod = "SUPER"
local terminal = "kitty"
-- settings.curve
hl.curve("smoothIn", {
["points"] = {
@@ -32,11 +36,14 @@ hl.animation({
})
-- settings.bind
hl.bind("SUPER + Q", (hl.dsp.window.close()), {
hl.bind((mod .. " + Q"), (hl.dsp.window.close()), {
["locked"] = true
})
hl.bind("SUPER + RETURN", (hl.dsp.exec_cmd("kitty")))
hl.bind((mod .. " + RETURN"), (hl.dsp.exec_cmd(terminal)))
hl.bind("SUPER + SHIFT + 1", (hl.dsp.window.move({ workspace = "1", follow = false })))
hl.bind((mod .. " + mouse:272"), (hl.dsp.window.drag()), {
["mouse"] = true
})
-- settings.config
hl.config({

View File

@@ -19,6 +19,14 @@ in
];
settings = {
mod = {
_var = "SUPER";
};
terminal = {
_var = "kitty";
};
config = {
input = {
kb_layout = "ro";
@@ -125,15 +133,15 @@ in
bind = [
{
_args = [
"SUPER + Q"
(lib.generators.mkLuaInline ''mod .. " + Q"'')
(lib.generators.mkLuaInline "hl.dsp.window.close()")
{ locked = true; }
];
}
{
_args = [
"SUPER + RETURN"
(lib.generators.mkLuaInline ''hl.dsp.exec_cmd("kitty")'')
(lib.generators.mkLuaInline ''mod .. " + RETURN"'')
(lib.generators.mkLuaInline "hl.dsp.exec_cmd(terminal)")
];
}
{
@@ -142,6 +150,13 @@ in
(lib.generators.mkLuaInline ''hl.dsp.window.move({ workspace = "1", follow = false })'')
];
}
{
_args = [
(lib.generators.mkLuaInline ''mod .. " + mouse:272"'')
(lib.generators.mkLuaInline "hl.dsp.window.drag()")
{ mouse = true; }
];
}
];
on = {