{ username ? throw "username argument is required", }: { config, lib, pkgs, ... }: let userConfig = config.users.users.${username}; hmConfig = config.home-manager.users.${username}; in { home-manager.users.${username} = { home = { packages = with pkgs; [ wl-clipboard cliphist ]; persistence."/cache${userConfig.home}".directories = [ "${hmConfig.xdg.relativeCacheHome}/cliphist" ]; }; systemd.user.services = { cliphist = { Unit = { Description = "Clipboard manager"; BindsTo = [ "graphical-session.target" ]; After = [ "graphical-session.target" ]; }; Service.ExecStart = lib.meta.getExe ( pkgs.writeShellApplication { name = "init-cliphist"; runtimeInputs = with pkgs; [ wl-clipboard cliphist ]; text = "exec wl-paste --watch cliphist store"; } ); Install.WantedBy = [ "graphical-session.target" ]; }; cliphist-image = { Unit = { Description = "Clipboard manager (images)"; BindsTo = [ "graphical-session.target" ]; After = [ "graphical-session.target" ]; }; Service.ExecStart = lib.meta.getExe ( pkgs.writeShellApplication { name = "init-cliphist-image"; runtimeInputs = with pkgs; [ wl-clipboard cliphist ]; text = "exec wl-paste --type image --watch cliphist store"; } ); Install.WantedBy = [ "graphical-session.target" ]; }; }; wayland.windowManager.hyprland.settings.bind = let cliphist = lib.meta.getExe pkgs.cliphist; rofi = lib.meta.getExe pkgs.rofi-wayland; wl-copy = "${pkgs.wl-clipboard}/bin/wl-copy"; in [ "$mod, v, exec, ${cliphist} list | ${rofi} -cache-dir ${hmConfig.xdg.cacheHome}/rofi -dmenu -display-columns 2 | ${cliphist} decode | ${wl-copy}" "$mod_Ctrl, v, exec, ${cliphist} list | ${rofi} -cache-dir ${hmConfig.xdg.cacheHome}/rofi -dmenu -display-columns 2 | ${cliphist} delete" "$mod_Ctrl_Shift, v, exec, ${cliphist} wipe" ]; }; }