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 # for special characters to work right # like # 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 bind d detach 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 ] # 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 ''; }; }; }; }