{config, lib, pkgs, ...}: let # A list is used because it preserves ordering tags = [ { name = "tag 1"; key = "something"; } { name = "tag 2"; } ... ]; # Attribute set of { = "use "; } keybinds = let tagsWithKeybinds = lib.filter (lib.hasAttr "key") tags; in lib.listToAttrs (map (x: lib.nameValuePair x.key "use ${x.name}") tagsWithKeybinds); in { xsession = { windowManager = { herbstluftwm = { enable = true; keybinds = '' Mod4-Control-h = "resize left +0.02" Mod4-Control-j = "resize down +0.02" Mod4-Control-k = "resize up +0.02" Mod4-Control-l = "resize right +0.02" Mod4-Control-Left = "resize left +0.02" Mod4-Control-Down = "resize down +0.02" Mod4-Control-Up = "resize up +0.02" Mod4-Control-Right = "resize right +0.02" ''; tags = lib.catAttrs "name" tags; }; }; }; }