{
  lib,
  config,
  pkgs,
  ...
}: let
  cfg = config.myConfig.shell.zsh;
in {
  options.myConfig.shell.zsh = {
    enable = lib.mkEnableOption "Zsh, an advanced shell";
  };

  config = lib.mkIf cfg.enable {
    programs.zsh = {
      enable = true;
      autosuggestion.enable = true;
      enableCompletion = true;
      defaultKeymap = "emacs";
      dotDir = ".config/zsh";
      history.expireDuplicatesFirst = true;
      history.path = "$ZDOTDIR/.zsh_history";
      historySubstringSearch.enable = true;
      shellAliases = {
        ls = "${pkgs.eza}/bin/eza --icons -a --group-directories-first";
        diff = "${pkgs.diffutils}/bin/diff --color=auto";
        grep = "${pkgs.gnugrep}/bin/grep --color=auto";
        ip = "${pkgs.iproute2}/bin/ip --color=auto";
        mkdir = "${pkgs.coreutils}/bin/mkdir -p";
        gst = "${pkgs.git}/bin/git status";
        gc = "${pkgs.git}/bin/git commit";
        ga = "${pkgs.git}/bin/git add";
        gpl = "${pkgs.git}/bin/git pull";
        gpu = "${pkgs.git}/bin/git push";
        gd = "${pkgs.git}/bin/git diff";
        gch = "${pkgs.git}/bin/git checkout";
        gs = "${pkgs.git}/bin/git switch";
        gre = "${pkgs.git}/bin/git restore";
        gr = "${pkgs.git}/bin/git remote";
        gcl = "${pkgs.git}/bin/git clone";
        glg = "${pkgs.git}/bin/git log --graph --abbrev-commit --decorate --format=format:'%C(bold green)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold yellow)(%ar)%C(reset)%C(auto)%d%C(reset)%n''         %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all";
        gb = "${pkgs.git}/bin/git branch";
        gm = "${pkgs.git}/bin/git merge";
        gf = "${pkgs.git}/bin/git fetch";
      };
      syntaxHighlighting.enable = true;
      syntaxHighlighting.highlighters = ["main" "brackets"];
      initExtra = ''
        # auto completion
        bindkey '^I' complete-word
        bindkey '^[[Z' autosuggest-accept
        # backspace
        bindkey '^[[3' delete-char
        # home / end go to beginning / end of line
        bindkey '^[[H' beginning-of-line
        bindkey '^[[F' end-of-line
        # ctrl+arrow jump word
        bindkey '^[[1;5D' backward-word
        bindkey '^[[1;5C' forward-word
        # ctrl+entf and ctrl+backspace delete word
        bindkey '^[[3;5~' delete-word
        bindkey '^H' backward-delete-word
      '';
    };

    programs.starship = {
      enable = true;
      enableZshIntegration = true;
      settings = {
        add_newline = false;
        command_timeout = 5000;
        character = {
          success_symbol = "[](bold green)";
          error_symbol = "[](bold red)";
        };
        cmd_duration = {
          min_time = 500;
          show_milliseconds = true;
        };
      };
    };

    programs.zoxide = {
      enable = true;
      enableZshIntegration = true;
      options = ["--cmd cd"];
    };
  };
}
