inputs@{ machine, ... }:
{
  imports = machine.program {
    name = "tmux";
    inherit inputs;
    requirements = [ "cli" ];
    home-config =
      { pkgs, ... }:
      {
        programs.tmux = {
          enable = true;
          mouse = true;
          clock24 = true;

          shortcut = "k";

          plugins = with pkgs; [
            {
              plugin = tmuxPlugins.mkTmuxPlugin {
                pluginName = "suspend";
                version = "1a2f806";
                src = pkgs.fetchFromGitHub {
                  owner = "MunifTanjim";
                  repo = "tmux-suspend";
                  rev = "1a2f806666e0bfed37535372279fa00d27d50d14";
                  sha256 = "0j7vjrwc7gniwkv1076q3wc8ccwj42zph5wdmsm9ibz6029wlmzv";
                };
              };
              extraConfig = ''
                set -g @suspend_key 'F11'
              '';
            }
            {
              plugin = tmuxPlugins.mode-indicator;
            }
          ];

          extraConfig = ''
            # unbind every single normal keybinding
            unbind-key -a

            set -g status-left "#{?client_prefix,#[bg=colour2],#[bg=colour1]}#[fg=colour0] #S "

            # for special characters to work right
            # like <C-_>
            # set-window-option -g xterm-keys on
            set -g default-terminal "screen-256color"

            set -g set-titles on
            set -g allow-passthrough on
            set -s escape-time 0

            set-option -g default-shell ${pkgs.fish}/bin/fish
            set -ga terminal-features "\*:hyperlinks"

            set-window-option -g mode-keys vi

            # clipboard stuff
            bind -T copy-mode-vi v send-keys -X begin-selection
            bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel
            bind v copy-mode
            bind p paste-buffer -p
            set -s set-clipboard on

            # get back normal terminal emulator bindings
            bind-key -n S-PPage copy-mode -u
            bind-key -T copy-mode -n S-NPage send-keys -X page-down

            # don't scroll to end when copying with mouse
            bind-key -T copy-mode    MouseDragEnd1Pane send-keys -X copy-pipe
            bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe
            bind-key -T copy-mode    DoubleClick1Pane  select-pane \; send-keys -X select-word \; run-shell -d 0.3 \; send-keys -X copy-pipe
            bind-key -T copy-mode    TripleClick1Pane  select-pane \; send-keys -X select-line \; run-shell -d 0.3 \; send-keys -X copy-pipe
            bind-key -T copy-mode-vi DoubleClick1Pane  select-pane \; send-keys -X select-word \; run-shell -d 0.3 \; send-keys -X copy-pipe
            bind-key -T copy-mode-vi TripleClick1Pane  select-pane \; send-keys -X select-line \; run-shell -d 0.3 \; send-keys -X copy-pipe

            #  window control
            bind t new-window -c "#{pane_current_path}"
            bind-key Tab next-window
            bind-key BTab previous-window
            set -g automatic-rename-format "#{?#{==:#{pane_current_path},$HOME},~,#{b:pane_current_path}} (#{pane_current_command})"
            set -g renumber-windows on
            bind-key Q confirm-before -p "kill-window #W? (y/n)" kill-window
            bind A last-window

            bind-key 1 select-window -t :0
            bind-key 2 select-window -t :1
            bind-key 3 select-window -t :2
            bind-key 4 select-window -t :3
            bind-key 5 select-window -t :4
            bind-key 6 select-window -t :5
            bind-key 7 select-window -t :6
            bind-key 8 select-window -t :7
            bind-key 9 select-window -t :8
            bind-key 0 select-window -t :9

            # pane control
            bind h select-pane -L
            bind j select-pane -D
            bind k select-pane -U
            bind l select-pane -R
            bind Left select-pane -L
            bind Down select-pane -D
            bind Up select-pane -U
            bind Right select-pane -R
            bind L split-window -h -c "#{pane_current_path}"
            bind J split-window -v -c "#{pane_current_path}"
            bind H split-window -h -b -c "#{pane_current_path}"
            bind K split-window -v -b -c "#{pane_current_path}"
            bind S-Left split-window -h -c "#{pane_current_path}"
            bind S-Down split-window -v -c "#{pane_current_path}"
            bind S-Up split-window -h -b -c "#{pane_current_path}"
            bind S-Right split-window -v -b -c "#{pane_current_path}"
            bind-key -r -T prefix M-h resize-pane -L 5
            bind-key -r -T prefix M-j resize-pane -D 5
            bind-key -r -T prefix M-k resize-pane -U 5
            bind-key -r -T prefix M-l resize-pane -R 5
            bind x swap-pane -D

            # double-click ^k (or lshift with kanata) for previous pane like ^w in vim
            bind -r ^k select-pane -l
            bind-key q confirm-before -p "kill-pane #P? (y/n)" kill-pane

            # bind-key o choose-tree -wZ
            # bind-key O choose-tree -sZ

            # get back command mode and some other basics...
            bind : command-prompt
            bind r source-file ~/.config/tmux/tmux.conf \; display "config reloaded"
            bind-key ? list-keys

            # Scroll oin man etc
            tmux_commands_with_legacy_scroll="nano less more man git"

            bind-key -T root WheelUpPane \
                if-shell -Ft= '#{?mouse_any_flag,1,#{pane_in_mode}}' \
                    'send -Mt=' \
                    'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
                        "send -t= Up" "copy-mode -et="'

            bind-key -T root WheelDownPane \
                if-shell -Ft = '#{?pane_in_mode,1,#{mouse_any_flag}}' \
                    'send -Mt=' \
                    'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
                        "send -t= Down" "send -Mt="'

            bind-key -T copy-mode-vi ] \
              send-keys -X clear-selection \; \
              send-keys -X search-forward "--> " \; \
              send-keys -X next-word \; \
              send-keys -X begin-selection \; \
              send-keys -X jump-forward ":" \; \
              send-keys -X jump-to-forward ":" \;

            bind-key -T copy-mode-vi [ \
              send-keys -X clear-selection \; \
              send-keys -X start-of-line \; \
              send-keys -X search-backward "--> " \; \
              send-keys -X next-word \; \
              send-keys -X begin-selection \; \
              send-keys -X jump-forward ":" \; \
              send-keys -X jump-to-forward ":" \;

            bind-key [ copy-mode \; send-keys [
            bind-key ] copy-mode \; send-keys ]

            bind d select-pane -l \; send-keys [

            # f: file search
            # unbound: git files
            # g: git hashes
            # u: urls
            # C-d: numbers
            # M-i: ips
            # include line and column numbers in file search
            # rebind `f` so we can reuse it here
            bind-key -T prefix C-f command-prompt { find-window -Z "%%" }
            # jyn is so sorry, and so am I now
            # https://github.com/jyn514/dotfiles/blob/65be3c004113290f41f858f4d7f1a6799fabab19/config/tmux.conf#L203-L212
            # see `search-regex.sh` for wtf this means
            # TODO: include shell variable names
            bind-key f copy-mode \; send-keys -X search-backward '(^|/|\<|[[:space:]"])((\.|\.\.)|[[:alnum:]~_"-]*)((/[][[:alnum:]_.#$%&+=@"-]+)+([/ "]|\.([][[:alnum:]_.#$%&+=@"-]+(:[0-9]+)?(:[0-9]+)?)|[][[:alnum:]_.#$%&+=@"-]+(:[0-9]+)(:[0-9]+)?)|(/[][[:alnum:]_.#$%&+=@"-]+){2,}([/ "]|\.([][[:alnum:]_.#$%&+=@"-]+(:[0-9]+)?(:[0-9]+)?)|[][[:alnum:]_.#$%&+=@"-]+(:[0-9]+)(:[0-9]+)?)?|(\.|\.\.)/([][[:alnum:]_.#$%&+=@"-]+(:[0-9]+)?(:[0-9]+)?))'
            # urls
            bind-key u copy-mode \; send-keys -X search-backward '(https?://|git@|git://|ssh://|ftp://|file:///)[[:alnum:]?=%/_.:,;~@!#$&*+-]*'
            # hashes
            bind-key g copy-mode \; send-keys -X search-backward '[[:<:]]([0-9a-f]{7,40}|[[:alnum:]]{52}|[0-9a-f]{64})[[:>:]]'
            # ips
            bind-key M-i copy-mode \; send-keys -X search-backward '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}'

            bind-key -T copy-mode-vi o send-keys -X copy-pipe \
                'cd #{pane_current_path}; xargs -I {} echo "echo {}" | bash | xargs ${../nvim/editor-hax.py} xdg-open-proxy' \; \
              if -F "#{alternate_on}" { send-keys -X cancel }
            # save the buffer, then open an editor in the current pane
            bind-key -T copy-mode-vi O send-keys -X copy-pipe-and-cancel \
                'tmux send-keys "C-q"; xargs -I {} tmux send-keys "vim {}"; tmux send-keys "C-m"'
            # search for the highlighted text
            bind-key -T copy-mode-vi s send-keys -X copy-pipe \
                "cd #{pane_current_path}; xargs -I {} open 'https://www.google.com/search?q={}'" \; \
              if -F "#{alternate_on}" { send-keys -X cancel }
            # save buffer and retype into the shell
            bind-key -T copy-mode-vi Tab send-keys -X copy-selection-and-cancel \; paste-buffer -p

          '';
        };
      };
  };
}
