{ user }: { lib, pkgs, config, ... }: with lib; let scripts = config.programs.scripts; hotkeyType = types.submodule ({ ... }: { options = { key = mkOption { description = "the key"; }; modifier = mkOption { description = "modifiers for the key"; default = "SUPER"; }; args = mkOption { description = "args for the script when use this key"; default = ""; }; }; }); scriptType = types.submodule ({ ... }: { options = { name = mkOption { description = "name of the executable"; }; text = mkOption { description = "the text of the script"; }; hotkeys = mkOption { type = types.listOf hotkeyType; description = "keys that run this script"; default = [ ]; }; install = mkOption { type = types.bool; default = true; }; }; }); scriptToPackage = script: pkgs.writeShellScriptBin script.name script.text; scriptExec = { script, hotkey }: "${scriptToPackage script}/bin/${script.name} ${hotkey.args}"; installScripts = scripts: (map scriptToPackage (filter (s: s.install) scripts)); bindScript = script: concatStrings ( map (hotkey: '' bind = ${hotkey.modifier}, ${hotkey.key}, exec, ${scriptExec {inherit script hotkey;}} '') script.hotkeys); bindScripts = scripts: "# === USER SCRIPTS MODULE ===\n" + concatStringsSep "\n" (map bindScript scripts); in { options.programs = { scripts = mkOption { type = types.listOf scriptType; default = [ ]; }; }; config = { home-manager.users.${user}.imports = [{ home.packages = installScripts scripts; wayland.windowManager.hyprland.extraConfig = bindScripts scripts; }]; }; }