{ lib, pkgs, config, ... }:
{
  home.packages = with pkgs; [
    binutils
    coreutils
    dnsutils
    dasht
    dosfstools
    #git
    bottom
    gptfdisk
    starship
    iputils
    jq
    manix
    moreutils
    nix-index
    cached-nix-shell
    nmap
    ripgrep
    skim
    tealdeer
    usbutils
    utillinux
    whois
    iftop
    wget
    curl
    exa
    bat
    fd
    ncdu
    duf
    trash-cli
    nix-index
    silver-searcher
    tcpdump
    mtr
    file
    lsof
    atool
    strace
    zip
    unzip
    rsync
    tmux
    pwgen
    glow
    pass
    less
    gdb
    xxd
    taskwarrior
    gnupg
    syncthing
    dijo
    #ssb-patchwork
    fontconfig
    pandoc
    taskwarrior-tui
    python3Packages.howdoi
    vimwiki-cli

    (pkgs.writeScriptBin "jq-repl" ''
      #!/usr/bin/env bash
      if [[ -z $1 ]] || [[ $1 == "-" ]]; then 
        input=$(mktemp)
        trap "rm -f $input" EXIT
        cat /dev/stdin > $input
      else
        input=$1
      fi

      echo "" \ | fzf --phony --preview-window="up:90%" --print-query --preview "jq --color-output -r {q} $input"
    '')
    (pkgs.writeScriptBin "clear-vim-trash" (builtins.readFile ./bin/clear-vim-trash.sh))
    (pkgs.writeScriptBin "flakify" ''
      #!/usr/bin/env zsh
      if [ ! -e flake.nix ]; then
        nix flake new -t github:nix-community/nix-direnv .
      elif [ ! -e .envrc ]; then
        echo "use flake" > .envrc
        direnv allow
      fi
      vim flake.nix
    '')
    (pkgs.writeScriptBin "mx" ''
      #!/usr/bin/env bash
      manix "" | grep '^# ' | sed 's/^# \(.*\) (.*/\1/;s/ (.*//;s/^# //' | fzf --preview="manix '{}'" | xargs manix
    '')
    (pkgs.writeScriptBin "monitor" ''
      # hotplug
      connect() {
          # Turn it on if it was off
          xrandr --output HDMI-2 --auto
          xrandr --output HDMI-2 --same-as eDP-1
      }

      disconnect() {
          xrandr --output HDMI-2 --off
      }

      xrandr | grep "HDMI-2 connected" &>>/dev/null && connect || disconnect
    '')
    (pkgs.writeScriptBin "disconnect-keyboard" ''
      # keyboard on curve is busted
      get_keyboard_id() {
        xinput list | grep 'AT Translated Set' | cut -f2 | cut -d'=' -f2 | xinput float 
      }

      disconnect_keyboard() {
        id=$(get_keyboard_id)
        xinput float $id
        unset id
      }

      attach_keyboard() {
        id=$(get_keyboard_id)
        xinput reattach $id 3
        unset id
      }

      disconnect_keyboard
    '')
  ];

  programs.zsh = {
    enable = true;
    enableCompletion = true;
    enableAutosuggestions = false;

    initExtra = ''
      bindkey -v
      autopair-init
    '';
    sessionVariables = {
      EDITOR = "nvim";
      TERMINFO_DIRS = "${pkgs.kitty.terminfo.outPath}/share/terminfo"; # Needed to run home-manager switch on non-nixOS
    };
    plugins = [
      {
        name = "zsh-autopair";
        src = pkgs.fetchFromGitHub {
          owner = "hlissner";
          repo = "zsh-autopair";
          rev = "34a8bca0c18fcf3ab1561caef9790abffc1d3d49";
          sha256 = "1h0vm2dgrmb8i2pvsgis3lshc5b0ad846836m62y8h3rdb3zmpy1";
        };
        file = "autopair.zsh";
      }
      {
        name = "zsh-syntax-highlighting";
        src = pkgs.fetchFromGitHub {
          owner = "zsh-users";
          repo = "zsh-syntax-highlighting";
          rev = "0.6.0";
          sha256 = "0zmq66dzasmr5pwribyh4kbkk23jxbpdw4rjxx0i7dx8jjp2lzl4";
        };
        file = "zsh-syntax-highlighting.zsh";
      }
      {
        name = "zsh-autoquoter";
        src = pkgs.fetchFromGitHub {
          owner = "ianthehenry";
          repo = "zsh-autoquoter";
          rev = "819a615fbfd2ad25c5d311080e3a325696b45de7";
          sha256 = "r0jdo+YFTOejvNMTqzXi5ftcLzDpuKejX0wMFwqKdJY=";
        };
        file = "zsh-autoquoter.zsh";
      }
      # {
      #   name = "zsh-nix-shell";
      #   file = "nix-shell.plugin.zsh";
      #   src = pkgs.fetchFromGitHub {
      #     owner = "chisui";
      #     repo = "zsh-nix-shell";
      #     rev = "v0.5.0";
      #     sha256 = "0za4aiwwrlawnia4f29msk822rj9bgcygw6a8a6iikiwzjjz0g91";
      #   };
      # }
    ];
  };

  programs.starship = {
    enable = true;
    enableZshIntegration = true;
  };

  programs.fzf = {
    enable = true;
    enableZshIntegration = true;
  };

  programs.direnv = {
    enable = true;
    enableZshIntegration = true;
    nix-direnv.enable = true;
  };

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

  services.kdeconnect.enable = true;

  home.shellAliases = {
    # quick cd
    ".." = "cd ..";
    "..." = "cd ../..";
    "...." = "cd ../../..";
    "....." = "cd ../../../..";

    # kitaab recents
    kr = "cd /home/anish/kitaab/vimwiki; exa --sort=modified --reverse | fzf --preview 'bat --style=numbers --color=always --terminal-width -1 ./{}'";
    icat = "kitty +kitten icat";
    yt = "ytfzf -T kitty -t ";
    gen-secret = "< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c\${1:-32};echo;";

    # modern cli tools 
    ls = "exa --icons";
    l = "exa -l --icons";
    la = "exa -la --icons";
    tree = "ls --tree --icons";
    cat = "bat";
    unzip = "aunpack";
    copy = "xclip -selection clipboard";
    paste = "xclip -selection clipboard -o";
    rm = "echo USE TRASH, FOOL: trash ";
    trash = "trash-put";
    make-secret = "< /dev/urandom \\tr -dc _A-Za-z0-9 | head -c \${1:-32};echo;";

    # task warrior
    # TODO: make blocked a context?
    t = "task -BLOCKED";
    tin = "task in";
    tun = "task -BLOCKED -wait";
    tb = "task list +backlog";
    tr = "task newest limit:page";
    tu = "task unblocked -wait";
    tl = "task list";
    ta = "task add";
    tai = "task add +in";
    tn = "task-note";
    tp = "task limit:page";
    ts = "task sync";

    # keeping for posterity but now sxhkbd handles screenshot with <Super+O>
    # scrot = "flameshot screen -c -p ~/screenshots/";
    # scrotgui = "flameshot gui -p ~/screenshots/";

    # git
    g = "git";

    # grep
    grep = "rg";
    gi = "grep -i";

    # internet ip
    myip = "dig +short myip.opendns.com @208.67.222.222 2>&1";

    # nix
    n = "nix";
    np = "n profile";
    ni = "np install";
    nr = "np remove";
    ns = "n search --no-update-lock-file";
    nf = "n flake";
    nfl = "nf lock";
    nepl = "n repl '<nixpkgs>'";
    srch = "ns nixpkgs";
    orch = "ns override";
    nrb = "cd /tmp; sudo nixos-rebuild switch --flake '/home/anish/usr/helm#curve'; cd $OLDPWD";
    nrt = "cd /tmp; sudo nixos-rebuild test --flake '/home/anish/usr/helm#curve'; cd $OLDPWD";
    ned = "cd /home/anish/usr/helm; vim; cd $OLDPWD";
    ncd = "cd /home/anish/usr/helm";
    mn = ''
      manix "" | grep '^# ' | sed 's/^# \(.*\) (.*/\1/;s/ (.*//;s/^# //' | sk --preview="manix '{}'" | xargs manix
    '';

    # sudo
    s = "sudo -E ";
    pls = "s";
    si = "sudo -i";
    se = "sudoedit";

    # top
    top = "btm";

    # systemd
    ctl = "systemctl";
    stl = "s systemctl";
    utl = "systemctl --user";
    ut = "systemctl --user start";
    un = "systemctl --user stop";
    up = "s systemctl start";
    dn = "s systemctl stop";
    jtl = "journalctl";

    # quick ssh
    kssh = "kitten +kitty ssh";
    smm = "ssh 10.0.69.4"; # box over wireguard
    sm = "ssh mossnet.lan"; # box regular
    sl = "ssh sealight.xyz"; # lituus
    sh = "ssh git.sealight.xyz"; # helix
    sb = "ssh cyberian@69.61.38.246"; # bonfire for allwell
  };
}
