# Forward modified keys (Shift/Ctrl/Alt+Enter) to apps like pi-coding-agent. # Without this, tmux collapses them to a plain Enter. Requires tmux 3.5+ for csi-u. set -g extended-keys on set -g extended-keys-format csi-u # Number windows (and panes) from 1 instead of 0 — easier to reach on the # keyboard. renumber-windows keeps them gap-free when a window is closed. set -g base-index 1 setw -g pane-base-index 1 set -g renumber-windows on # --- Session persistence (survives reboot) --------------------------------- # resurrect: save/restore sessions, windows, panes, layout and working dirs # (prefix + Ctrl-s to save, prefix + Ctrl-r to restore). # continuum: auto-saves every 15 min and auto-restores when the tmux server # starts, so sessions come back after a reboot. Both via tpm. set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-continuum' # Also capture pane scrollback and restore running programs (nvim, …). # nvim 'session' strategy restores via Session.vim when present, else plain nvim. set -g @resurrect-capture-pane-contents 'on' set -g @resurrect-strategy-nvim 'session' # Auto-restore the last saved environment on tmux server start. set -g @continuum-restore 'on' # Auto-start a detached tmux server at login: continuum writes and enables a # systemd --user unit (~/.config/systemd/user/tmux.service). With the restore # option above, sessions are already back and waiting after a reboot+login. set -g @continuum-boot 'on' # --- Status bar (Catppuccin Mocha, flat) ----------------------------------- # Palette: bg #1e1e2e · surface #313244 · divider #45475a · muted #6c7086/#7f849c # text #cdd6f4 · subtext #a6adc8 · accent(mauve) #cba6f7 set -g status on set -g status-position bottom # (also tmux's default) set -g status-interval 5 # refresh clock + CPU every 5s set -g status-justify left set -g status-style "bg=default,fg=#cdd6f4" # transparent: no bar background set -g status-left-length 40 set -g status-right-length 100 # Left: session name (mauve/bold) + thin divider. set -g status-left " #[fg=#cba6f7,bold]#S #[fg=#45475a]│ " # Middle: flat window list — inactive muted, active mauve/bold, 2-space gaps. set -g window-status-separator " " setw -g window-status-format "#[fg=#7f849c]#I #[fg=#6c7086]#W" setw -g window-status-current-format "#[fg=#cba6f7,bold]#I #[fg=#cdd6f4,bold]#W" setw -g window-status-activity-style "fg=#f9e2af" # Right: net dl/ul · cpu · mem │ date │ clock. continuum prepends its invisible # save hook here (this block sits above the tpm `run` line, so the hook survives # every reload). Metrics are scripts/*.sh, symlinked into ~/.config/tmux/scripts/. set -g status-right "#[fg=#a6e3a1]#(~/.config/tmux/scripts/net.sh dl) #[fg=#f9e2af]#(~/.config/tmux/scripts/net.sh ul) #[fg=#89b4fa]#(~/.config/tmux/scripts/cpu.sh) #[fg=#94e2d5]#(~/.config/tmux/scripts/mem.sh) #[fg=#fab387]#(~/.config/tmux/scripts/temp.sh)#[fg=#45475a]│ #[fg=#a6adc8]%a %b %-d #[fg=#45475a]│ #[fg=#cba6f7,bold]%H:%M " # Two rows: [0] drawn top-border rule · [1] the bar content. The rule doubles as # the separator from the pane content above; tmux status height is whole rows, so # one row above the content is the smallest gap that still shows a border. # Full-width run of ─ (yes|head|paste avoids %, backslashes and nested parens so # tmux's strftime/quote/#() parsing leave it alone); tmux truncates it to width. # status-format[1] is tmux 3.7's default content template (status-left/windows/right). set -g status 2 set -g status-format[0] "#[fg=#6c7086,bg=default]#(yes ─ | head -n 400 | paste -sd '')" set -g status-format[1] "#[align=left range=left #{E:status-left-style}]#[push-default]#{T;=/#{status-left-length}:status-left}#[pop-default]#[norange default]#[list=on align=#{status-justify}]#[list=left-marker]<#[list=right-marker]>#[list=on]#{W:#[range=window|#{window_index} #{E:window-status-style}#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style},#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}]#[push-default]#{T:window-status-format}#[pop-default]#[norange default]#{?loop_last_flag,,#{E:window-status-separator}},#[range=window|#{window_index} list=focus #{?#{!=:#{E:window-status-current-style},default},#{E:window-status-current-style},#{E:window-status-style}}#{?#{&&:#{window_last_flag},#{!=:#{E:window-status-last-style},default}}, #{E:window-status-last-style},}#{?#{&&:#{window_bell_flag},#{!=:#{E:window-status-bell-style},default}}, #{E:window-status-bell-style},#{?#{&&:#{||:#{window_activity_flag},#{window_silence_flag}},#{!=:#{E:window-status-activity-style},default}}, #{E:window-status-activity-style},}}]#[push-default]#{T:window-status-current-format}#[pop-default]#[norange list=on default]#{?loop_last_flag,,#{E:window-status-separator}}}#[nolist align=right range=right #{E:status-right-style}]#[push-default]#{T;=/#{status-right-length}:status-right}#[pop-default]#[norange default]" # Round out the theme so no default green leaks into borders/messages/modes. set -g pane-border-style "fg=#313244" set -g pane-active-border-style "fg=#cba6f7" set -g message-style "bg=#313244,fg=#cdd6f4" set -g message-command-style "bg=#313244,fg=#cdd6f4" set -g mode-style "bg=#45475a,fg=#cdd6f4" set -g clock-mode-colour "#cba6f7" # Initialize tpm — KEEP THIS LINE AT THE VERY BOTTOM of tmux.conf. run '~/.config/tmux/plugins/tpm/tpm'