# Set the tmux version to check for command support run 'tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-8)' # Use vim keybindings in copy mode set -g mode-keys vi # Change prefix to C-Space unbind C-b set -g prefix C-Space bind Space send-prefix # Address vim mode switching delay set -s escape-time 0 # Increase scrollback buffer size set -g history-limit 1000000 # Set tmux messages display time to 4 seconds set -g display-time 4000 # Refresh 'status-left' and 'status-right' more often set -g status-interval 2 # Upgrade $TERM set -g default-terminal "tmux-256color" # Focus events enabled for terminals that support them set -g focus-events on # TODO: Change this comment to something that explains the setting # super useful when using "grouped sessions" and multi-monitor setup setw -g aggressive-resize on # Start window & pane index at 1 set -g pane-base-index 1 # Enable mouse support set-option -g mouse on # Enable changing cursor shape per pane, vim or zsh should emit escape # sequences to change cursor shape. # iTerm2 only requires this before tmux 2.9 if '[ -n $ITERM_PROFILE ] && [[ "$TMUX_VERSION" < "2.9" ]]' \ 'set -ga terminal-overrides "*:Ss=\E]1337;CursorShape=%p1%d\7"' # VTE compatible terminals. if '[ ! -n $ITERM_PROFILE ]' \ 'set -ga terminal-overrides "*:Ss=\E[%p1%d q:Se=\E[2 q"' # Enable strikethrough on VTE compatible terminals. set -ga terminal-overrides 'xterm*:smxx=\E[9m' # Set only on macOS where it's required if -b '[ "`uname`" = "Darwin" ]' \ 'set -g default-command "reattach-to-user-namespace -l $SHELL"' # Restore old next/previous window bindings bind C-n next-window bind C-p previous-window # Make new splits open in current directory bind '"' split-window -c '#{pane_current_path}' bind '%' split-window -h -c '#{pane_current_path}' # Change word separators to better match Vim. set -g word-separators "<>(){}[]/'\";@*+,.-_=!£$%^&:#~?`¬|\\ " # Integrate pane selection with vim in_vim='tmux show-window-options | grep -q "@vim#{pane_id}"' bind -n C-h if $in_vim 'send-keys C-h' 'select-pane -L' bind -n C-j if $in_vim 'send-keys C-j' 'select-pane -D' bind -n C-k if $in_vim 'send-keys C-k' 'select-pane -U' bind -n C-l if $in_vim 'send-keys C-l' 'select-pane -R' # Integrate urlscan or fallback to urlview if -b 'which urlscan' \ 'bind u capture-pane \; split-window "tmux show-buffer | urlscan"' \ 'bind u capture-pane \; split-window "tmux show-buffer | urlview -"' # Unbind copy mode defaults so pane selection works unbind -T copy-mode-vi C-h unbind -T copy-mode-vi C-j # Enter copy mode with C-U bind C-u copy-mode -u # Begin selection in copy mode with v not Space bind -T copy-mode-vi v send-keys -X begin-selection # Enable mouse scrolling up in alternate buffers. # If #{mouse_any_flag} is 1 the pane is running with mouse support, e.g. vim. # If #{alternate_on} is 1 the terminal is in alternate buffer mode, e.g. less. # If #{pane_in_mode} is 1 the pane is in copy-mode. bind -n WheelUpPane \ if -Ft= "#{mouse_any_flag}" \ "send-keys -M" \ "if -Ft= \"#{alternate_on}\" \ \"send-keys -t= Up ; \ send-keys -t= Up ; \ send-keys -t= Up ; \" \ \"select-pane -t= ; \ if -Ft= '#{pane_in_mode}' \ 'send-keys -M' \ 'copy-mode -e ; send-keys -M' \" " # Emulate mouse scrolling down in alternate buffers. bind -n WheelDownPane \ if -Ft= "#{mouse_any_flag}" \ "send-keys -M" \ "if -Ft= \"#{alternate_on}\" \ \"send-keys -t= Down ; \ send-keys -t= Down ; \ send-keys -t= Down ; \" \ \"select-pane -t= ; \ send-keys -M\" " # Yank to the system clipboard in copy mode if -b '[ "`uname`" = "Darwin" ]' \ 'bind -T copy-mode-vi y send-keys -X copy-pipe \ "reattach-to-user-namespace pbcopy"' \ 'bind -T copy-mode-vi y send -X copy-pipe \ "xclip -i -sel p -f | xclip -i -sel c"' # Left status style if -b '[ -n $WSL_DISTRO_NAME ]' \ 'setw -g status-left " #(hostname)|#{WSL_DISTRO_NAME}|#{session_name}"' \ 'setw -g status-left " #(hostname)|#{session_name}"' setw -g status-left-style fg=colour240,bg=colour233 setw -g status-left-length 32 # Centre status style setw -g status-style fg=colour240,bg=colour233 # Right status style shows system info, date, and time. setw -g status-right "#[fg=colour240]#(cat ~/.cache/tmux/system-info)#[fg=white] %a %d-%m-%y %H:%M " setw -g status-right-style fg=white,bg=colour233 if -b '[ "`uname`" != "Darwin" ]' \ 'run "tmux setw -g status-right-length $((`nproc --all` + 32))"' # Active window status style setw -g window-status-current-format " #{window_index}: #{window_name}" setw -g window-status-current-style fg=white,bg=colour233 # Inactive window status style setw -g window-status-format " #{window_index}: #{window_name}" setw -g window-status-style fg=colour240,bg=colour233 # Pane border style set -g pane-border-style fg=colour233,bg=colour233 set -g pane-active-border-style fg=colour235,bg=colour235 # Command line window list selection set-window-option -g mode-style fg=white,bg=colour237 set-option -g message-style fg=white,bg=colour237