Files

277 lines
8.2 KiB
Bash

# =============================================
# Tmux Configuration
# =============================================
# -----------------------------------------
# Core Settings (Fixing Pi's Warning)
# -----------------------------------------
# Enable extended keys for modified Enter keys to work properly
set -g extended-keys on
# Format for extended keys (csi-u required for Pi)
set -g extended-keys-format csi-u
# Enable true color support
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"
# =============================================
# Theme Colors (generated by matugen)
# =============================================
source-file ~/.config/tmux/colors.conf
# Faster escape time (for vim/neovim)
set -sg escape-time 10
# Increase scrollback buffer size
set -g history-limit 50000
# Enable mouse support (scroll, select, resize)
set -g mouse on
# Start window and pane numbering at 1 (easier to reach)
set -g base-index 1
setw -g pane-base-index 1
# Renumber windows when one is closed
set -g renumber-windows on
# Allow focus events (for vim/neovim)
set -g focus-events on
# -----------------------------------------
# Prefix Key (Change from Ctrl+b to Ctrl+s)
# -----------------------------------------
unbind C-b
set -g prefix C-s
bind C-s send-prefix
# -----------------------------------------
# Window Management
# -----------------------------------------
# Create new window
bind c new-window -c "#{pane_current_path}"
# Split panes with | and - (more intuitive)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# Quick window switching with prefix + number
bind -r 1 select-window -t 1
bind -r 2 select-window -t 2
bind -r 3 select-window -t 3
bind -r 4 select-window -t 4
bind -r 5 select-window -t 5
bind -r 6 select-window -t 6
bind -r 7 select-window -t 7
bind -r 8 select-window -t 8
bind -r 9 select-window -t 9
# Swap windows left/right
bind -r < swap-window -t -1
bind -r > swap-window -t +1
# -----------------------------------------
# Pane Navigation (Vim-style)
# -----------------------------------------
# Move between panes with vim keys
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Zellij-style: Alt+arrows to navigate panes (no prefix!)
bind -n M-Left select-pane -L
bind -n M-Down select-pane -D
bind -n M-Up select-pane -U
bind -n M-Right select-pane -R
# Resize panes - Ctrl+S then r, then arrows
bind r switch-client -T resize-pane
bind -T resize-pane Left resize-pane -L 5 \; switch-client -T resize-pane
bind -T resize-pane Right resize-pane -R 5 \; switch-client -T resize-pane
bind -T resize-pane Up resize-pane -U 5 \; switch-client -T resize-pane
bind -T resize-pane Down resize-pane -D 5 \; switch-client -T resize-pane
bind -T resize-pane Escape switch-client -T root
bind -T resize-pane Enter switch-client -T root
# -----------------------------------------
# Moving Panes (Zellij-like)
# -----------------------------------------
# Break pane into new window (pop out)
bind b break-pane
# Join pane from another window (bring in)
bind j command-prompt -p "join pane from window #:" "join-pane -s '%%'"
# Swap panes with directional keys
bind > swap-pane -D
bind < swap-pane -U
# Move panes around - Ctrl+s m then arrows
bind m switch-client -T move-pane
bind -T move-pane Left swap-pane -s '{left-of}' \; switch-client -T move-pane
bind -T move-pane Right swap-pane -s '{right-of}' \; switch-client -T move-pane
bind -T move-pane Up swap-pane -s '{up-of}' \; switch-client -T move-pane
bind -T move-pane Down swap-pane -s '{down-of}' \; switch-client -T move-pane
bind -T move-pane Escape switch-client -T root
bind -T move-pane Enter switch-client -T root
# Mark pane + swap with marked pane (advanced)
bind M select-pane -m # Mark current pane (capital M)
bind * swap-pane # Swap with marked pane
# Move pane to another window by number
bind @ command-prompt -p "send pane to window #:" "join-pane -t ':%%'"
# Alt+Shift+Left/Right for previous/next window (Zellij-style tabs)
bind -n M-S-Left previous-window
bind -n M-S-Right next-window
# -----------------------------------------
# Layouts (Stacking-like)
# -----------------------------------------
# Cycle through layouts: even-horizontal, even-vertical, main-horizontal, main-vertical, tiled
bind Space next-layout
bind BSpace previous-layout
# Quick layout shortcuts
bind Enter select-layout tiled
# Easy horizontal/vertical layouts
bind = select-layout even-horizontal
bind + select-layout even-vertical
# Toggle between horizontal and vertical
bind t run-shell "tmux list-windows -F '#{window_layout}' | head -1 | grep -q 'even-horizontal' && tmux select-layout even-vertical || tmux select-layout even-horizontal"
# Other layouts - Ctrl+L then h/v (no prefix)
bind -n C-l switch-client -T layout
bind -T layout h select-layout main-horizontal \; switch-client -T root
bind -T layout v select-layout main-vertical \; switch-client -T root
# Note: Pane resize with H/J/K/L is defined in the resize section above
# -----------------------------------------
# Copy Mode (Vim-style)
# -----------------------------------------
setw -g mode-keys vi
# Enter copy mode with prefix + [
bind [ copy-mode
# v to start selection (like vim)
bind -T copy-mode-vi v send -X begin-selection
# y to yank (copy)
bind -T copy-mode-vi y send -X copy-selection-and-cancel
# Escape to exit copy mode
bind -T copy-mode-vi Escape send -X cancel
# -----------------------------------------
# Session Management
# -----------------------------------------
# Prefix + d to detach from session (keeps it running)
# Reattach with: tmux attach
# Prefix + s to list and switch sessions
bind s choose-session
# Prefix + $ to rename current session
bind $ command-prompt -I "#S" "rename-session '%%'"
# Prefix + , to rename current window
bind , command-prompt -I "#W" "rename-window '%%'"
# -----------------------------------------
# Status Bar
# -----------------------------------------
# Update status bar every second
set -g status-interval 1
# Position at top (for dual status bar with tabs on top, cheatsheet on bottom)
# Note: status-position bottom puts tabs at bottom-1, cheatsheet at very bottom
# Status bar sizing
set -g status-left-length 40
set -g status-right-length 100
# Note: Colors are defined in ~/.config/tmux/colors.conf (generated by matugen)
# The theme file sets: status-style, status-left, status-right,
# window-status-format, window-status-current-format, pane borders, etc.
# -----------------------------------------
# Single Status Bar at Bottom
# -----------------------------------------
set -g status on
set -g status-position bottom
set -g status-interval 1
set -g status-left-length 40
set -g status-right-length 150
# -----------------------------------------
# Other Useful Bindings
# -----------------------------------------
# Prefix + . to reload config
bind . source-file ~/.config/tmux/tmux.conf \; display "Config reloaded!"
# Prefix + x to kill current pane (with confirmation)
bind x confirm-before -p "kill-pane #P? (y/n)" kill-pane
# Prefix + & to kill current window (with confirmation)
bind & confirm-before -p "kill-window #W? (y/n)" kill-window
# Synchronize all panes in current window (toggle)
bind S set synchronize-panes
# Zoom current pane (toggle full-screen for pane)
bind z resize-pane -Z
# -----------------------------------------
# Plugins (local dotfiles)
# -----------------------------------------
# Set plugin path to dotfiles location
set-environment -g TMUX_PLUGIN_MANAGER_PATH '~/.config/tmux/plugins/'
# Resurrect settings
set -g @resurrect-save 'S'
set -g @resurrect-restore 'L'
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-strategy-nvim 'session'
# Continuum settings - auto-save every 15 minutes
set -g @continuum-save-interval '15'
set -g @continuum-restore 'on'
# Load plugins directly (bypass TPM)
run '~/.config/tmux/plugins/tmux-resurrect/resurrect.tmux'
run '~/.config/tmux/plugins/tmux-continuum/continuum.tmux'
# -----------------------------------------
# Notification Settings
# -----------------------------------------
# Enable activity monitoring
setw -g monitor-activity on
set -g visual-activity off
# Bell settings
set -g bell-action any
set -g visual-bell off