{pkgs, ...}: {
  home.packages = with pkgs; [
    fzf
  ];
  programs.fish = {
    enable = true;
    plugins = [
      {
        name = "theme-agnoster";
        src = pkgs.fetchFromGitHub {
          owner = "oh-my-fish";
          repo = "theme-agnoster";
          rev = "c142e802983bd1b34b4d91efac2126fc5913126d";
          sha256 = "0PLx626BWoBp/L6wgkB4o+53q8PymiEE/rTu2mfzHhg=";
          fetchSubmodules = true;
        };
      }
      {
        name = "fzf";
        src = pkgs.fetchFromGitHub {
          owner = "jethrokuan";
          repo = "fzf";
          rev = "479fa67d7439b23095e01b64987ae79a91a4e283";
          sha256 = "0k6l21j192hrhy95092dm8029p52aakvzis7jiw48wnbckyidi6v";
          fetchSubmodules = true;
        };
      }
    ];
    shellAliases = {
      ls = "ls --color=auto";
      crontab = "crontab -i";
    };

    shellAbbrs = {
      lessr = "less -R";
      jqc = "jq -C";
    };

    #interactiveShellInit = ''
    #  echo "programs.fish.interactiveShellInit"
    #'';
    shellInit = ''
      # key bindings
      bind \cr '__fzf_reverse_isearch'

      # PATH
      set -U fish_user_paths $HOME/.local/bin $HOME/.local/bin/pio

      # pass
      #set -x PASSWORD_STORE_ENABLE_EXTENSIONS true
      set -x AWS_VAULT_BACKEND pass
      set -x AWS_VAULT_PASS_PREFIX aws
      complete -c pw --no-files -a '(__fish_pass_print_entries)'

      # colors
      set -x GCC_COLORS 'error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

      abbr --add v vim

      #alias cal='ncal -b -M'
      alias myip='dig +short myip.opendns.com @resolver1.opendns.com'

      function hm -d 'merge history and delete failed commands'
          history --merge

          if test -z "$fish_private_mode" && test -e "$__fish_user_data_dir/successful_commands" && test -e "$__fish_user_data_dir/failed_commands"
              while read line;
                  if ! grep -qFx $line "$__fish_user_data_dir/successful_commands"
                      set hist_command (echo $line | base64 -d)
                      echo "deleting command: $hist_command"
                      echo "."
                      history delete --exact --case-sensitive $hist_command
                  end
              end < "$__fish_user_data_dir/failed_commands"
              echo -n > "$__fish_user_data_dir/successful_commands"
              echo -n > "$__fish_user_data_dir/failed_commands"
          end
      end
      hm

      # fancy tools
      if which eza > /dev/null 2>&1
          alias l=eza
          alias ll='eza -l --time-style=long-iso --git'
          alias la='eza -la --time-style=long-iso --git'
          alias tree='eza --tree'
          alias llt='eza -s modified -l'
      else
          alias l=ls
          alias ll='ls -l'
          alias la='ls -la'
          alias llt='ls -trl'
      end

      if which rg > /dev/null 2>&1
          alias g=rg
          complete -c g -w rg
      else if which ag > /dev/null 2>&1
          alias g=ag
          complete -c g -w ag
      else
          alias g='grep --color=auto'
          complete -c g -w grep
      end

      function jqless -d 'jq -C [args] | less -R'
          jq -C $argv | less -R
      end

      # NixOS direnv
      if which direnv > /dev/null
          eval (direnv hook fish)
      end

      function __cut_commandline -d 'cut commandline and paste it later'
          set -g commandline_buffer (commandline)
          commandline ""
      end



      function __postexec --on-event fish_postexec
          if test $status -ne 0
              if test -z "$hist_cmd"
                  if test -z "$fish_private_mode"
                      echo $argv[1] | base64 >> "$__fish_user_data_dir/failed_commands"
                  end
              end
          else
              if test -z "$fish_private_mode"
                  echo $argv[1] | base64 >> "$__fish_user_data_dir/successful_commands"
              end
              commandline $commandline_buffer
              set -e commandline_buffer
          end
      end

      function dirh-nocolor --description "Print the current directory history (the prev and next lists)"
          set -l options h/help
          argparse -n dirh --max-args=0 $options -- $argv
          or return

          if set -q _flag_help
              __fish_print_help dirh
              return 0
          end

          set -l dirc (count $dirprev)
          if test $dirc -gt 0
              set -l dirprev_rev $dirprev[-1..1]
              # This can't be (seq $dirc -1 1) because of BSD.
              set -l dirnum (seq 1 $dirc)
              for i in $dirnum[-1..1]
                  printf '%s\n' $dirprev_rev[$i]
              end
          end

          echo $PWD

          set -l dirc (count $dirnext)
          if test $dirc -gt 0
              set -l dirnext_rev $dirnext[-1..1]
              for i in (seq $dirc)
                  printf '%s\n' $dirnext_rev[$i]
              end
          end
      end

      function dirh-fzf -d 'directory history fuzzy finder'
          builtin cd (dirh-nocolor | uniq | fzf)
      end

      bind \ed 'dirh-fzf'
    '';
  };

  xdg.configFile."fish/completions/mycli.fish".text = ''
    complete -e -c mycli
    complete -c mycli -f -s h -l host     -d "Host address of the database."
    complete -c mycli -f -s P -l port     -d "Port number to use for connection."
    complete -c mycli -f -s u -l user     -d "User name to connect to the database."
    complete -c mycli -f -s S -l socket   -d "The socket file to use for connection."
    complete -c mycli -f -s p -l pass \
                              -l password -d "Password to connect to the database."
    complete -c mycli -f -s V -l version  -d "Output mycli's version."
    complete -c mycli -f -s v -l verbose  -d "Verbose output."
    complete -c mycli -f -s d -l dsn      -d "Use DSN configured into the [alias_dsn] section of myclirc file."
    complete -c mycli -f      -l list-dsn -d "list of DSN configured into the [alias_dsn] section of myclirc file."

    complete -c mycli -f -s t -l table    -d "Display batch output in table format."
    complete -c mycli -f      -l csv      -d "Display batch output in CSV format."
    complete -c mycli -f      -l warn \
                              -l no-warn  -d "Warn before running a destructive query."
    complete -c mycli -f -s e -l execute  -d "Execute command and quit."


    complete -c mycli -f -s h -l host -r -a '(__fish_print_hostnames)'
    complete -c mycli -f -s d -l dsn -r -a '(mycli --list-dsn)'
  '';
}
