{
  pkgs,
  config,
  lib,
  ...
}:
with lib;
{
  options.components.terminal.zsh.enable = mkOption {
    type = lib.types.bool;
    default = config.components.terminal.enable;
  };

  config = mkIf (config.components.terminal.zsh.enable) {

    # root uses zsh on default
    users.users.root.shell = pkgs.zsh;

    programs.zsh = {

      enable = true;
      enableCompletion = true;
      syntaxHighlighting.enable = true;

      shellAliases = {
        ls = "ls --color=tty";
        l = "ls -CFh";
        la = "ls -Ah";
        ll = "ls -lh";
        lt = "ls -lct --reverse";
        less = "less -S";
        top = "htop";
        version = "date '+%Y%m%d%H%M%S'";
        vclip = "xclip -selection clipboard";
        df = "df -h";
        timestamp = "date +%Y%m%d%H%M%S";
        nix-show-garbadge-roots = "ls -lh /nix/var/nix/gcroots/auto/";
      };

      interactiveShellInit = ''
        kpaste() {
          arg=cat
          if [[ $# -ne 0 ]]; then
            arg+=("''${@}")
          elif [[ -t 0 ]] && [[ -o interactive ]]; then
            arg=(wl-paste)
          fi
          "''${arg[@]}" | curl -sS http://p.r --data-binary @- | \
            sed '$ {p;s|http://p.r|https://p.krebsco.de|}'
        }
      '';

    };

  };
}