{ config, pkgs, lib, ... }: let cfg = config.programs.kitty; # helper scripts for changing kitty colors term-background = pkgs.writeShellScriptBin "term-background" '' # Accepts the name of a theme file in color-pkg # If shell is running in a Kitty window set the colors. if [ -n "$KITTY_WINDOW_ID" ]; then kitty @ --to $KITTY_LISTEN_ON set-colors --all --configured \ ${cfg.colors.color-pkg}/"$1".conf & fi ''; term-light = pkgs.writeShellScriptBin "term-light" '' ${term-background}/bin/term-background ${cfg.colors.light-name} ''; term-dark = pkgs.writeShellScriptBin "term-dark" '' ${term-background}/bin/term-background ${cfg.colors.dark-name} ''; inherit (lib) mkIf mkOption types; in { options.programs.kitty = { colors = { enable = mkOption { type = types.bool; default = false; description = '' When enabled, commands term-dark and term-light will toggle between your dark and a light colors. There is also term-background which accepts one argument, the name of the theme. (Note that the Kitty setting allow_remote_control = true is set to enable this functionality.) ''; }; color-pkg = mkOption { type = types.package; default = pkgs.kitty-colors; description = "Package from which to load kitty colors."; }; light-name = mkOption { type = types.str; default = "light"; description = "The name to use for the light colorscheme."; }; dark-name = mkOption { type = types.str; default = "dark"; description = "The name to use for the dark colorscheme."; }; }; }; config = mkIf cfg.enable { home.packages = mkIf cfg.colors.enable [ term-light term-dark term-background ]; programs.kitty.settings = mkIf cfg.colors.enable { allow_remote_control = "yes"; listen_on = "unix:/tmp/mykitty"; }; xdg.configFile."kitty/macos-launch-services-cmdline" = mkIf (pkgs.stdenv.isDarwin && cfg.colors.enable) { text = "--listen-on unix:/tmp/mykitty"; }; }; }