{
  config,
  lib,
  pkgs,
  ...
}: 
{
  home.packages = with pkgs; [comma ripgrep];
  home.sessionVariables.STARSHIP_CACHE = "${config.xdg.cacheHome}/starship";
  programs = {
    nix-index.enable = false;

    eza.enable = true;

    zoxide = {
      enable = true;
      enableZshIntegration = true;
    };

    dircolors = {
      enable = true;
      enableZshIntegration = true;
    };

    skim = {
      enable = true;
      enableZshIntegration = true;
      defaultCommand = "rg --files --hidden";
      changeDirWidgetOptions = [
        "--preview 'eza --icons --git --color always -T -L 3 {} | head -200'"
        "--exact"
      ];
    };

    starship = {
      enable = true;
      settings = {
        add_newline = true;
        scan_timeout = 1;
        #character = {
          #error_symbol = "[󰊠](bold red)";
          #success_symbol = "[󰊠](bold green)";
          #vicmd_symbol = "[󰊠](bold yellow)";
          #format = "$symbol [|](bold bright-black) ";
        #};
        git_commit = {commit_hash_length = 4;};
        line_break.disabled = false;
        lua.symbol = "[](blue) ";
        python.symbol = "[](blue) ";
        hostname = {
          ssh_only = true;
          format = "[$hostname](bold blue) ";
          disabled = false;
        };
      };
    };

    zsh = {
      enable = true;

      dotDir = ".config/zsh";

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

      initExtra = ''
        autoload -U compinit
        setopt no_auto_remove_slash

        fuck () {
          TF_PYTHONIOENCODING=$PYTHONIOENCODING;
          export TF_SHELL=zsh;
          export TF_ALIAS=fuck;
          TF_SHELL_ALIASES=$(alias);
          export TF_SHELL_ALIASES;
          TF_HISTORY="$(fc -ln -10)";
          export TF_HISTORY;
          export PYTHONIOENCODING=utf-8;
          TF_CMD=$(
              thefuck THEFUCK_ARGUMENT_PLACEHOLDER $@
          ) && eval $TF_CMD;
          unset TF_HISTORY;
          export PYTHONIOENCODING=$TF_PYTHONIOENCODING;
          test -n "$TF_CMD" && print -s $TF_CMD
        }
      '';

      history = {
        save = 2000000;
        size = 2000000;
        expireDuplicatesFirst = true;
        ignoreDups = true;
        ignoreSpace = true;
	path = "$HOME/.local/state/zsh/history";
      };

      shellAliases = with pkgs; with lib; {
        rebuild = "doas nix-store --verify; pushd ~/.config/dotfiles && nixos-rebuild switch --flake .# --use-remote-sudo && notify-send \"Done\" && bat cache --build; popd";
        update = "doas nix-store --verify; pushd ~/.config/dotfiles && nix flake udpate && nixos-rebuild switch --upgrade-all --flake .# --use-remote-sudo && notify-send \"Done\" && bat cache --build; popd";
        cleanup = "doas nix-collect-garbage --delete-older-than 7d";
        bloat = "nix path-info -Sh /run/current-system";
        cat = "${getExe bat} --style=plain";
        vpn = getExe mullvad;
        grep = getExe ripgrep;
        fzf = getExe skim;
        MANPAGER = "sh -c 'col -bx | bat -l man -p'";
        du = getExe du-dust;
        ps = getExe procs;
        m = "mkdir -p";
        fcd = "cd $(find -type d | fzf)";
        l = "ls -lF --time-style=long-iso --icons";
        sc = "sudo systemctl";
        scu = "systemctl --user ";
        la = "${getExe eza} -lah";
        ls = "${getExe eza} -h --git --icons --color=auto --group-directories-first -s extension";
        tree = "${getExe eza} --tree --icons --tree";
        burn = "pkill -9";
        diff = "diff --color=auto";
        ".." = "cd ..";
        "..." = "cd ../../";
        "...." = "cd ../../../";
        "....." = "cd ../../../../";
        "......" = "cd ../../../../../";
        v = "${getExe neovim}";
        vim = "${getExe neovim}";
      };
      plugins = with pkgs; [
        {
          name = "zsh-vi-mode";
          src = zsh-vi-mode;
          file = "share/zsh-vi-mode/zsh-vi-mode.plugin.zsh";
        }
      ];
    };
  };
}
