{ config, lib, pkgs, ... }: # Clipboard history: cliphist records every copy, picked back through rofi. let # The picker reuses the themed rofi, so history looks like every other menu # the launcher drives. # decode is needed because list emits id-prefixed lines rather than the copied # bytes, so the chosen id has to be resolved back before it can be re-copied. picker = pkgs.writeShellScript "clipboard-picker" '' ${lib.getExe pkgs.cliphist} list \ | ${lib.getExe pkgs.rofi} -dmenu -i -p Clipboard \ | ${lib.getExe pkgs.cliphist} decode \ | ${lib.getExe' pkgs.wl-clipboard "wl-copy"} ''; in { options.modules.desktop.utilities.clipboard.enable = lib.mkEnableOption "cliphist clipboard history"; config = lib.mkIf config.modules.desktop.utilities.clipboard.enable { home-manager.users.${config.user.name} = { # wl-copy and wl-paste on PATH, so the shell can pipe into and out of the # clipboard. # The watchers and picker above reach wl-clipboard by store path, so this # is for interactive use alone. home.packages = [ pkgs.wl-clipboard ]; # Two watchers record text and images to history, bound to the graphical # session so uwsm starts and stops them with it. services.cliphist.enable = true; }; registry.keybind.${config.networking.hostName}.clipboard-history = { keys = "SUPER + SHIFT + V"; action = { kind = "exec"; command = "${picker}"; }; }; }; }