home-manager/modules/programs/kitty.nix
Emily 9f9e277b60 treewide: remove now-redundant lib.mdDoc calls
These (and the `*MD` functions apart from `literalMD`) are now no-ops
in nixpkgs and serve no purpose other than to add additional noise and
potentially mislead people into thinking unmarked DocBook documentation
will still be accepted.

Note that if backporting changes including documentation to 23.05,
the `mdDoc` calls will need to be re-added.

To reproduce this commit, run:

    $ NIX_PATH=nixpkgs=flake:nixpkgs/e7e69199f0372364a6106a1e735f68604f4c5a25 \
      nix shell nixpkgs#coreutils \
      -c find . -name '*.nix' \
      -exec nix run -- github:emilazy/nix-doc-munge/98dadf1f77351c2ba5dcb709a2a171d655f15099 \
      --strip {} +
    $ ./format
2023-07-17 18:49:09 +01:00

228 lines
6.6 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.programs.kitty;
eitherStrBoolInt = with types; either str (either bool int);
optionalPackage = opt:
optional (opt != null && opt.package != null) opt.package;
toKittyConfig = generators.toKeyValue {
mkKeyValue = key: value:
let
value' =
(if isBool value then lib.hm.booleans.yesNo else toString) value;
in "${key} ${value'}";
};
toKittyKeybindings = generators.toKeyValue {
mkKeyValue = key: command: "map ${key} ${command}";
};
toKittyEnv =
generators.toKeyValue { mkKeyValue = name: value: "env ${name}=${value}"; };
shellIntegrationInit = {
bash = ''
if test -n "$KITTY_INSTALLATION_DIR"; then
source "$KITTY_INSTALLATION_DIR/shell-integration/bash/kitty.bash"
fi
'';
fish = ''
if set -q KITTY_INSTALLATION_DIR
source "$KITTY_INSTALLATION_DIR/shell-integration/fish/vendor_conf.d/kitty-shell-integration.fish"
set --prepend fish_complete_path "$KITTY_INSTALLATION_DIR/shell-integration/fish/vendor_completions.d"
end
'';
zsh = ''
if test -n "$KITTY_INSTALLATION_DIR"; then
autoload -Uz -- "$KITTY_INSTALLATION_DIR"/shell-integration/zsh/kitty-integration
kitty-integration
unfunction kitty-integration
fi
'';
};
shellIntegrationDefaultOpt = {
default = cfg.shellIntegration.mode != "disabled";
defaultText = literalExpression ''
config.programs.kitty.shellIntegration.mode != "disabled"
'';
};
in {
options.programs.kitty = {
enable = mkEnableOption "Kitty terminal emulator";
package = mkOption {
type = types.package;
default = pkgs.kitty;
defaultText = literalExpression "pkgs.kitty";
description = ''
Kitty package to install.
'';
};
darwinLaunchOptions = mkOption {
type = types.nullOr (types.listOf types.str);
default = null;
description = "Command-line options to use when launched by Mac OS GUI";
example = literalExpression ''
[
"--single-instance"
"--directory=/tmp/my-dir"
"--listen-on=unix:/tmp/my-socket"
]
'';
};
settings = mkOption {
type = types.attrsOf eitherStrBoolInt;
default = { };
example = literalExpression ''
{
scrollback_lines = 10000;
enable_audio_bell = false;
update_check_interval = 0;
}
'';
description = ''
Configuration written to
{file}`$XDG_CONFIG_HOME/kitty/kitty.conf`. See
<https://sw.kovidgoyal.net/kitty/conf.html>
for the documentation.
'';
};
theme = mkOption {
type = types.nullOr types.str;
default = null;
description = ''
Apply a Kitty color theme. This option takes the friendly name of
any theme given by the command {command}`kitty +kitten themes`.
See <https://github.com/kovidgoyal/kitty-themes>
for more details.
'';
example = "Space Gray Eighties";
};
font = mkOption {
type = types.nullOr hm.types.fontType;
default = null;
description = "The font to use.";
};
keybindings = mkOption {
type = types.attrsOf types.str;
default = { };
description = "Mapping of keybindings to actions.";
example = literalExpression ''
{
"ctrl+c" = "copy_or_interrupt";
"ctrl+f>2" = "set_font_size 20";
}
'';
};
environment = mkOption {
type = types.attrsOf types.str;
default = { };
description = "Environment variables to set or override.";
example = literalExpression ''
{
"LS_COLORS" = "1";
}
'';
};
shellIntegration = {
mode = mkOption {
type = types.str;
default = "enabled";
example = "no-cursor";
description = ''
Set the mode of the shell integration. This accepts the same options
as the `shell_integration` option of Kitty. Note that
`no-rc` is always implied. See
<https://sw.kovidgoyal.net/kitty/shell-integration>
for more details.
'';
};
enableBashIntegration = mkEnableOption "Kitty Bash integration"
// shellIntegrationDefaultOpt;
enableFishIntegration = mkEnableOption "Kitty fish integration"
// shellIntegrationDefaultOpt;
enableZshIntegration = mkEnableOption "Kitty Z Shell integration"
// shellIntegrationDefaultOpt;
};
extraConfig = mkOption {
default = "";
type = types.lines;
description = "Additional configuration to add.";
};
};
config = mkIf cfg.enable {
home.packages = [ cfg.package ] ++ optionalPackage cfg.font;
xdg.configFile."kitty/kitty.conf" = {
text = ''
# Generated by Home Manager.
# See https://sw.kovidgoyal.net/kitty/conf.html
'' + concatStringsSep "\n" ([
(optionalString (cfg.font != null) ''
font_family ${cfg.font.name}
${optionalString (cfg.font.size != null)
"font_size ${toString cfg.font.size}"}
'')
(optionalString (cfg.theme != null) ''
include ${pkgs.kitty-themes}/share/kitty-themes/${
let
matching = filter (x: x.name == cfg.theme) (builtins.fromJSON
(builtins.readFile
"${pkgs.kitty-themes}/share/kitty-themes/themes.json"));
in throwIf (length matching == 0)
"kitty-themes does not contain a theme named ${cfg.theme}"
(head matching).file
}
'')
''
# Shell integration is sourced and configured manually
shell_integration no-rc ${cfg.shellIntegration.mode}
''
(toKittyConfig cfg.settings)
(toKittyKeybindings cfg.keybindings)
(toKittyEnv cfg.environment)
cfg.extraConfig
]);
} // optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
onChange = ''
${pkgs.procps}/bin/pkill -USR1 -u $USER kitty || true
'';
};
xdg.configFile."kitty/macos-launch-services-cmdline" = mkIf
(cfg.darwinLaunchOptions != null && pkgs.stdenv.hostPlatform.isDarwin) {
text = concatStringsSep " " cfg.darwinLaunchOptions;
};
programs.bash.initExtra =
mkIf cfg.shellIntegration.enableBashIntegration shellIntegrationInit.bash;
programs.fish.interactiveShellInit =
mkIf cfg.shellIntegration.enableFishIntegration shellIntegrationInit.fish;
programs.zsh.initExtra =
mkIf cfg.shellIntegration.enableZshIntegration shellIntegrationInit.zsh;
};
}