# cat << EOF > /dev/null # -- general # set-option default-path "$PWD" # deprecated in tmux 1.9 setw -g xterm-keys on set-window-option -g xterm-keys on set -s escape-time 0 set -sg repeat-time 300 set -s focus-events on set -s extended-keys on set -as terminal-features 'xterm*:extkeys' set -g mouse on set -sg exit-empty on set -g detach-on-destroy off set -g allow-passthrough on set -q -g status-utf8 on setw -q -g utf8 on set -g visual-activity off setw -g monitor-activity off setw -g monitor-bell off set -g history-limit 10000 # reload configuration bind r source-file ~/.tmux.conf \; display '~/.tmux.conf sourced' set -ga update-environment '\ DISPLAY DBUS_SESSION_BUS_ADDRESS \ QT_IM_MODULE QT_QPA_PLATFORMTHEME \ SESSION_MANAGER \ XDG_CONFIG_HOME XDG_CACHE_HOME XDG_DATA_HOME\ XDG_MENU_PREFIX XDG_RUNTIME_DIR XDG_SESSION_CLASS \ XDG_SESSION_DESKTOP XDG_SESSION_TYPE XDG_CURRENT_DESKTOP \ XMODIFIERS \ FZF_DEFAULT_OPTS \ TMUX_THEME_COLOR \ TERM TERM_PROGRAM \ ' # -- Hooks (unset before setting to avoid duplicates on reload) set-hook -gu client-attached set-hook -g client-attached 'run -b "test -x ~/.config/agent-tracker/bin/tracker-client && ~/.config/agent-tracker/bin/tracker-client command acknowledge --client #{client_tty} --session-id #{session_id} --window-id #{window_id} --pane #{pane_id} || true"' set-hook -ag client-attached 'run -b "tmux refresh-client -S"' set-hook -gu pane-focus-in set-hook -g pane-focus-in "run -b 'bash ~/.config/tmux/fzf_panes.tmux update_mru_pane_ids'" set-hook -ag pane-focus-in 'run -b "test -x ~/.config/agent-tracker/bin/tracker-client && ~/.config/agent-tracker/bin/tracker-client command acknowledge --client #{client_tty} --session-id #{session_id} --window-id #{window_id} --pane #{pane_id} || true"' set-hook -ag pane-focus-in 'run -b "tmux set -wu -t #{window_id} @unread 2>/dev/null || true"' set-hook -ag pane-focus-in 'run -b "tmux refresh-client -S"' set-hook -gu pane-died set-hook -g pane-died 'run -b "test -x ~/.config/agent-tracker/bin/tracker-client && ~/.config/agent-tracker/bin/tracker-client command delete_task --client #{client_tty} --session-id #{session_id} --window-id #{window_id} --pane #{pane_id} || true"' set-hook -ag pane-died 'run -b "test -x ~/.config/agent-tracker/bin/tracker-client && ~/.config/agent-tracker/bin/tracker-client command note_archive_pane --client #{client_tty} --session-id #{session_id} --window-id #{window_id} --pane #{pane_id} || true"' # -- Project-specific window activation hooks # Checks for ./on-tmux-window-activate.sh or ../on-tmux-window-activate.sh and runs it set-hook -gu after-select-window set-hook -g after-select-window 'run-shell "~/.config/tmux/scripts/check_and_run_on_activate.sh \"#{pane_current_path}\""' # set-hook -ag window-linked 'run -b "tmux refresh-client -S"' # set-hook -ag window-unlinked 'run -b "tmux refresh-client -S"' # set-hook -ag window-renamed 'run -b "tmux refresh-client -S"' # set-hook -ag window-layout-changed 'run -b "tmux refresh-client -S"' # set-hook -ag after-kill-window 'run -b "tmux refresh-client -S"' # # set-hook -gu client-session-changed # set-hook -g client-session-changed 'run -b "tmux refresh-client -S"' # set-hook -gu session-created set-hook -ag session-created 'run -b "~/.config/tmux/scripts/session_created.sh"' set-hook -ag session-created 'run -b "tmux refresh-client -S"' set-hook -gu session-renamed set-hook -g session-renamed 'run -b "tmux refresh-client -S"' set-hook -gu session-closed set-hook -g session-closed 'run -b "tmux refresh-client -S"' run-shell "~/.config/tmux/scripts/session_created.sh" # -- prefix unbind C-b set -g prefix 'C-s' # -- display set -g base-index 1 setw -g pane-base-index 1 setw -g automatic-rename on set -g renumber-windows on set -g set-titles on set -g display-panes-time 2000 set -g display-time 2000 # -- navigation # create session bind C-c new-session bind -n M-S run-shell "~/.config/tmux/scripts/new_session.sh" bind -n M-O break-pane bind -n M-s run-shell "~/.config/tmux/scripts/toggle_scratchpad.sh" # window management bind -n M-o new-window -c "#{pane_current_path}" bind -n M-Q kill-pane bind -n M-t run-shell "test -x ~/.config/agent-tracker/bin/tracker-client && ~/.config/agent-tracker/bin/tracker-client command toggle --client '#{client_tty}' || true" bind . command-prompt -p "Rename session to:" "run-shell \"~/.config/tmux/scripts/rename_session_prompt.sh '%%'\"" unbind , bind , command-prompt -p "Rename window:" "rename-window '%%'" # window navigation unbind n unbind p unbind 1 unbind 2 unbind 3 unbind 4 unbind 5 unbind 6 unbind 7 unbind 8 unbind 9 unbind 0 bind -r C-p previous-window bind -r C-n next-window bind -n M-1 select-window -t 1 bind -n M-2 select-window -t 2 bind -n M-3 select-window -t 3 bind -n M-4 select-window -t 4 bind -n M-5 select-window -t 5 bind -n M-6 select-window -t 6 bind -n M-7 select-window -t 7 bind -n M-8 select-window -t 8 bind -n M-9 select-window -t 9 bind -n M-! join-pane -t :1 bind -n M-@ join-pane -t :2 bind -n 'M-#' join-pane -t :3 bind -n 'M-$' join-pane -t :4 bind -n M-% join-pane -t :5 bind -n M-^ join-pane -t :6 bind -n M-& join-pane -t :7 bind -n M-* join-pane -t :8 bind -n M-( join-pane -t :9 bind u split-window -vb -c "#{pane_current_path}" bind e split-window -v -c "#{pane_current_path}" bind n split-window -hb -c "#{pane_current_path}" bind i split-window -h -c "#{pane_current_path}" bind -n M-f resize-pane -Z # paste from system clipboard bind -n C-S-v run -b "~/.config/tmux/scripts/paste_from_clipboard.sh" bind -T copy-mode-vi C-S-v send-keys -X cancel \; run -b "~/.config/tmux/scripts/paste_from_clipboard.sh" bind -T copy-mode C-S-v send-keys -X cancel \; run -b "~/.config/tmux/scripts/paste_from_clipboard.sh" # Alt+Shift+V paste bind -n M-V run -b "~/.config/tmux/scripts/paste_from_clipboard.sh" bind -T copy-mode-vi M-V send-keys -X cancel \; run -b "~/.config/tmux/scripts/paste_from_clipboard.sh" bind -T copy-mode M-V send-keys -X cancel \; run -b "~/.config/tmux/scripts/paste_from_clipboard.sh" # pane navigation bind 1 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 1" bind 2 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 2" bind 3 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 3" bind 4 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 4" bind 5 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 5" bind 6 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 6" bind 7 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 7" bind 8 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 8" bind 9 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 9" bind 0 run-shell "~/.config/tmux/scripts/move_window_to_session.sh 10" bind -n M-n select-pane -L bind -n M-e select-pane -D bind -n M-u select-pane -U bind -n M-i select-pane -R bind > swap-pane -D bind < swap-pane -U bind | swap-pane bind -n M-b run-shell 'val=$(tmux show -wv @unread 2>/dev/null); if [ "$val" = "1" ]; then tmux set -wu @unread; else tmux set -w @unread 1; fi; tmux refresh-client -S' bind -n M-w run-shell -b 'val=$(tmux show -wv @watching 2>/dev/null); if [ "$val" = "1" ]; then tmux set -wu @watching; tmux refresh-client -S; else ~/.config/tmux/scripts/watch_pane.sh "#{pane_id}" "#{window_id}"; fi' bind -n M-m run-shell "test -f ~/.config/agent-tracker/scripts/focus_latest_notified.sh && bash ~/.config/agent-tracker/scripts/focus_latest_notified.sh || true" bind -n M-M run-shell "test -f ~/.config/agent-tracker/scripts/focus_last_origin.sh && bash ~/.config/agent-tracker/scripts/focus_last_origin.sh || true" bind Space run-shell "~/.config/tmux/scripts/toggle_orientation.sh" bind W choose-tree -Z bind S choose-tree 'move-pane -v -s "%%"' bind V choose-tree 'move-pane -h -s "%%"' # pane resizing bind -n M-N resize-pane -L 3 bind -n M-E resize-pane -D 3 bind -n M-U resize-pane -U 3 bind -n M-I resize-pane -R 3 set -g status-keys emacs set -g mode-keys vi bind -n M-v copy-mode bind -T copy-mode-vi v send-keys -X begin-selection bind -T copy-mode-vi C-v send-keys -X rectangle-toggle bind -T copy-mode-vi n send-keys -X cursor-left bind -T copy-mode-vi i send-keys -X cursor-right bind -T copy-mode-vi u send-keys -X cursor-up bind -T copy-mode-vi e send-keys -X cursor-down bind -T copy-mode-vi h send-keys -X next-word-end bind -T copy-mode-vi U send-keys -N 5 -X cursor-up bind -T copy-mode-vi E send-keys -N 5 -X cursor-down bind -T copy-mode-vi N send-keys -X start-of-line bind -T copy-mode-vi I send-keys -X end-of-line bind -T copy-mode-vi Y send-keys -X copy-end-of-line bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "~/.config/tmux/scripts/copy_to_clipboard.sh" bind -T copy-mode-vi = send-keys -X search-again bind -T copy-mode-vi = send-keys -X search-reverse bind b list-buffers bind p paste-buffer bind l run-shell "~/.config/tmux/scripts/move_session.sh left" bind y run-shell "~/.config/tmux/scripts/move_session.sh right" bind -n M-l swap-window -d -t :-1 bind -n M-y swap-window -d -t :+1 bind I run-shell "~/.config/tmux/scripts/layout_builder.sh right" bind N run-shell "~/.config/tmux/scripts/layout_builder.sh left" bind U run-shell "~/.config/tmux/scripts/layout_builder.sh up" bind E run-shell "~/.config/tmux/scripts/layout_builder.sh down" # -- toggle_syn_input bind C-g if-shell '[[ $(tmux showw synchronize-panes | cut -d\ -f2) == "on" ]]' \ 'setw synchronize-panes off; set -g pane-border-style fg=#{?#{!=:#{environ:TMUX_THEME_COLOR},},#{environ:TMUX_THEME_COLOR},#b294bb}' \ 'setw synchronize-panes on; set -g pane-border-style fg=red' # -- toggle_status # -- theme # panes run-shell "~/.config/tmux/scripts/update_theme_color.sh" setw -g pane-border-status top set -g pane-scrollbars on set -g pane-scrollbars-position right set -g pane-active-border-style fg=#b294bb set -g pane-border-style fg=colour244 setw -g pane-border-format '#{?pane_active, #[fg=#{@theme_color}]#[bg=#{@theme_color}]#[fg=#1d1f21]#[bold] #{?window_zoomed_flag,⛶ ,} #(~/.config/tmux/scripts/pane_starship_title.sh #{pane_pid} #{pane_width} "#{pane_current_path}" "#{pane_current_command}") #[bg=default]#[fg=#{@theme_color}]#[default], #[fg=colour244]#[bg=colour244]#[fg=#1d1f21] #{?window_zoomed_flag,⛶ ,} #(~/.config/tmux/scripts/pane_starship_title.sh #{pane_pid} #{pane_width} "#{pane_current_path}" "#{pane_current_command}") #[bg=default]#[fg=colour244]#[default] }' #set -g pane-active-border-style fg=brightblue #set -g pane-border-style fg=magenta # windows # windows set -g status-justify 'left' set -g status-left-length 90 set -g status-right-length 140 setw -g window-status-separator '' # default statusbar colors set -g status-bg black #set -g status-left ' #[fg=magenta,bold]❐ #S' #set -g status-left '#[fg=brightyellow] #{?client_prefix,⌨ , } #[fg=magenta,bold] %Y-%m-%d %H:%M ' #set -g status-right '#(rainbarf --battery --remaining --bolt --tmux --rgb)' #set -g status-left "#[fg=magenta,bold] %Y-%m-%d %H:%M | #[fg=brightblue]#(curl icanhazip.com) #(ifconfig en0 | grep 'inet ' | awk '{print \"en0 \" $2}') #(ifconfig en1 | grep 'inet ' | awk '{print \"en1 \" $2}') #(ifconfig en3 | grep 'inet ' | awk '{print \"en3 \" $2}') #(ifconfig tun0 | grep 'inet ' | awk '{print \"vpn \" $2}') " setw -g window-status-format '#[fg=#c5c8c6] #W#(~/.config/tmux/tmux-status/window_task_icon.sh "#{window_id}") ' setw -g window-status-current-format '#[fg=#{@theme_color},bold] #W#(~/.config/tmux/tmux-status/window_task_icon.sh "#{window_id}") ' setw -g window-status-activity-style bg=black setw -g window-status-bell-style bg=black #set-window-option -g window-status-current-format "#[fg=colour235, bg=colour27]⮀#[fg=colour255, bg=colour27] #I ⮁ #W #[fg=colour27, bg=colour235]⮀" set-option -g status-left "#(~/.config/tmux/tmux-status/left.sh \"#{session_id}\" \"#{session_name}\") " set-option -g status-right "#(~/.config/tmux/tmux-status/right.sh)" # session index switching bind -n C-1 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 1" bind -n C-2 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 2" bind -n C-3 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 3" bind -n C-4 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 4" bind -n C-5 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 5" bind -n C-6 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 6" bind -n C-7 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 7" bind -n C-8 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 8" bind -n C-9 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 9" bind -n F1 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 1" bind -n F2 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 2" bind -n F3 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 3" bind -n F4 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 4" bind -n F5 run-shell -b "~/.config/tmux/scripts/switch_session_by_index.sh 5" # True color support set -g default-terminal "tmux-256color" set -as terminal-features ",*256col*:RGB" set -as terminal-overrides ",*256col*:Tc" unbind -T copy-mode-vi C-u unbind -T copy-mode-vi C-e bind -T copy-mode-vi C-u send-keys -N 5 -X scroll-up bind -T copy-mode-vi C-e send-keys -N 5 -X scroll-down # ─── Plugins (TPM) ─────────────────────────────────────────────── set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-continuum' # Disable TPM keybindings (managed via upgrade-all) set -g @tpm-install 'M-F12' set -g @tpm-update 'M-F12' set -g @tpm-clean 'M-F12' # Resurrect: save pane contents, custom save key set -g @resurrect-capture-pane-contents 'on' set -g @resurrect-save 's' # Continuum: auto-save every 5 minutes set -g @continuum-save-interval '5' # Initialize TPM (keep at very bottom) run '~/.tmux/plugins/tpm/tpm'