{
  config,
  lib,
  pkgs,
  ...
}: let
  inherit (lib) mkIf;
  hasPackage = pname: lib.any (p: p ? pname && p.pname == pname) config.home.packages;
  hasRipgrep = hasPackage "ripgrep";
  hasLftp = hasPackage "lftp";
  hasExa = hasPackage "eza";
  hasLazygit = config.programs.lazygit.enable;
  hasLazydocker = hasPackage "lazydocker";
  hasNixYourShell = hasPackage "nix-your-shell";
  hasShellColor = config.programs.shellcolor.enable;
  hasWezterm = config.programs.wezterm.enable;
  shellcolor = "${pkgs.shellcolord}/bin/shellcolor";
in {
  programs.fish = {
    enable = true;
    interactiveShellInit = ''
      ${
        if hasNixYourShell
        then "nix-your-shell fish | source"
        else ""
      }
    '';
    plugins = [
      {
        name = "grc";
        src = pkgs.fishPlugins.grc.src;
      }
      {
        name = "fzf";
        src = pkgs.fishPlugins.fzf.src;
      }
      {
        name = "tide";
        src = pkgs.fishPlugins.tide.src;
      }
      {
        name = "sponge";
        src = pkgs.fishPlugins.sponge.src;
      }
      {
        name = "autopair";
        src = pkgs.fishPlugins.autopair.src;
      }
      {
        name = "puffer";
        src = pkgs.fishPlugins.puffer.src;
      }
      {
        name = "z";
        src = pkgs.fishPlugins.z.src;
      }
    ];
    shellAliases = {
      lzg = mkIf hasLazygit "lazygit";
      lzd = mkIf hasLazydocker "lazydocker";
      batt = ''upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -e "percentage" -e "state"'';
      slp = "systemctl suspend";
      sdn = "shutdown 0";
      nrs = "nh os switch ~/.setup";

      ls = mkIf hasExa "eza";
      ll = mkIf hasExa "eza -l";
      la = mkIf hasExa "eza -la";
      exa = mkIf hasExa "eza";

      imgcat = mkIf hasWezterm "wezterm imgcat";
    };
    shellAbbrs = rec {
      jqless = "jq -C | less -r";

      n = "nix";
      nd = "nix develop -c $SHELL";
      ns = "nix shell";
      nsn = "nix shell nixpkgs#";
      nb = "nix build";
      nbn = "nix build nixpkgs#";
      nf = "nix flake";

      glk = "gpg --list-keys --with-keygrip";
      gssh = "gpg --export-ssh-key";
      gnk = "gpg --full-generate-key --expert";
      gek = "gpg --edit-key --expert";

      udmount = "udisksctl mount -b";
      udumount = "udisksctl unmount -b";

      fftp = mkIf hasLftp "lftp -u ghoscht, sftp://192.168.178.35";
      arss = "sudo autorestic exec -av -- snapshots";
    };
    functions = {
      # Disable greeting
      fish_greeting = "";
      fish_init_custom = ''
        tide configure --auto --style=Rainbow --prompt_colors='True color' --show_time=No --rainbow_prompt_separators=Vertical --powerline_prompt_heads=Slanted --powerline_prompt_tails=Flat --powerline_prompt_style='Two lines, frame' --prompt_connection=Solid --powerline_right_prompt_frame=No --prompt_connection_andor_frame_color=Darkest --prompt_spacing=Compact --icons='Many icons' --transient=Yes
      '';
    };
  };
  home.packages = with pkgs; [grc fzf nix-your-shell];

  # Applies tide configure on rebuild
  home.activation.configureTide = lib.hm.dag.entryAfter ["writeBoundary"] ''
    ${pkgs.fish}/bin/fish -c "fish_init_custom"
  '';
}