{self, ...}: {
  programs.zoxide = {
    enable = true;
    enableZshIntegration = true;
  };
  programs.zsh = {
    enable = true;

    sessionVariables = {
      SOUNDS_ENABLED = "1";
      EDITOR = "nvim";
      SUDO_EDITOR = "nvim";
      VISUAL = "nvim";
      LANG = "en_US.UTF-8";
      BROWSER = "firefox";
      FLAKEPATH = "$HOME/.sysflake";
    };

    oh-my-zsh = {
      enable = true;
      plugins = ["git" "fzf"];
    };

    enableCompletion = true;
    history = {
      path = "$HOME/.zsh_history";
      save = 10000;
      size = 10000;
      share = true;
    };

    autosuggestion = {
      enable = true;
      highlight = "fg=#4C566A,underline";
    };

    shellAliases = {
      grep = "grep --color=auto";
      yazi = "y";
      vi = "nvim";
      mv = "mv -v";
      cp = "cp -vr";
      gt = "gtrash";
      gtp = "playshellsound ${self}/assets/sound/rm.wav; gtrash put";
      sr = "source ~/.zshrc";
      ".." = "cd ..";
      rm = "echo 'use \"gtp\" instead'";
      psg = "ps aux | grep -v grep | grep -i -e VSZ -e";
      mkdir = "mkdir -p";
      pk = "pkill -9 -f";
      svcu = "systemctl --user";
      svc = "sudo systemctl";
      viflake = "nvim flake.nix";

      #git
      "ga" = "playshellsound ${self}/assets/sound/gitadd.wav; git add";
      gcomm = "gitcommit_sfx";
      gpush = "gitpush_sfx";
      gpull = "gitpull_sfx";
      greb = "gitrebase_sfx";
    };
    initExtra = ''
      playshellsound() {
        if [ $# -ne 1 ]; then
          echo "Usage: playshellsound <path/to/sound>"
          return 1
        fi
        if ! scheck; then
          return 0
        else
          runbg aplay "$1"
        fi
      }
      gitrebase_sfx() {
        if git rebase "$@"; then
          playshellsound ${self}/assets/sound/gitrebase.wav
          return 0
        else
          playshellsound ${self}/assets/sound/error.wav
          return 1
        fi
      }
      gitcommit_sfx() {
        if git commit "$@"; then
          playshellsound ${self}/assets/sound/gitcommit.wav
          return 0
        else
          playshellsound ${self}/assets/sound/error.wav
          return 1
        fi
      }
      gitpush_sfx() {
        if git push "$@"; then
          playshellsound ${self}/assets/sound/gitpush.wav
          return 0
        else
          playshellsound ${self}/assets/sound/error.wav
          return 1
        fi
      }
      gitpull_sfx() {
        if git pull "$@"; then
          playshellsound ${self}/assets/sound/gitpull.wav
          return 0
        else
          playshellsound ${self}/assets/sound/error.wav
          return 1
        fi
      }
      unalias ls
      ls() {
      	eza -1 --group-directories-first --icons "$@"
      	playshellsound ${self}/assets/sound/ls.wav
        return 0
      }

      mkcd() {
        mkdir -p "$1" && cd "$1"
      }

      y() {
      	local tmp="$(mktemp -t "yazi-cwd.XXXXXX")"
      	yazi "$@" --cwd-file="$tmp"
      	if cwd="$(command cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
      		builtin cd -- "$cwd"
      	fi
      	rm -f -- "$tmp"
      }

      cd() {
        local prev_sounds_enabled="$SOUNDS_ENABLED"
        SOUNDS_ENABLED=0
        eza -1 --group-directories-first --icons "$@"
        SOUNDS_ENABLED=$prev_sounds_enabled
        builtin cd "$@"
        playshellsound /nix/store/7a9w7np3qrvmzxjbs7xj05qq2yccgfsj-source/assets/sound/cd.wav
        return 0
      }
      if [ ! -e $HOME/.zsh_history ]; then
      	touch $HOME/.zsh_history
      	chmod 600 $HOME/.zsh_history
      fi
      setopt APPEND_HISTORY     # Append history to the history file (don't overwrite)
      setopt INC_APPEND_HISTORY # Append to the history file incrementally
      setopt SHARE_HISTORY      # Share history between all zsh sessions

      sessionVariables = {
      setopt CORRECT
      setopt NO_NOMATCH
      setopt LIST_PACKED
      setopt ALWAYS_TO_END
      setopt GLOB_COMPLETE
      setopt COMPLETE_ALIASES
      setopt COMPLETE_IN_WORD
      setopt AUTO_CD
      setopt AUTO_CONTINUE
      setopt LONG_LIST_JOBS
      setopt HIST_VERIFY
      setopt SHARE_HISTORY
      setopt HIST_IGNORE_SPACE
      setopt HIST_SAVE_NO_DUPS
      setopt HIST_IGNORE_ALL_DUPS
      setopt EXTENDED_GLOB
      setopt TRANSIENT_RPROMPT
      setopt INTERACTIVE_COMMENTS

      autoload -U compinit     # completion
      autoload -U terminfo     # terminfo keys
      zmodload -i zsh/complist # menu completion
      autoload -U promptinit   # prompt

      autoload -U up-line-or-beginning-search; zle -N up-line-or-beginning-search
      autoload -U down-line-or-beginning-search; zle -N down-line-or-beginning-search

      bindkey -v
      type starship_zle-keymap-select >/dev/null || \
      {
      	eval "$(starship init zsh)"
      }
      unalias ls
      clear
      splash
      playshellsound ${self}/assets/sound/sh-source.wav
      [ ! -f $FLAKEPATH/flake.nix ] && echo "WARNING: flake.nix not found at \$FLAKEPATH. Shell aliases for editing config files won't work correctly!" && echo "Edit the FLAKEPATH session variable in zshell.nix to point to the path where you saved the system configuration flake."
    '';
  };
}
