# Address vim mode switching delay & garbage text on start set -s escape-time 1 # Set global hooks to perform actions when events occur set-hook -g session-created 'run ~/.config/tmux/hooks/session-create.sh' # 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 # 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" # Enable true-color if '[[ "$TMUX_VERSION" < "3.2" ]]' \ 'set-option -as terminal-features ",xterm*:Tc"' \ 'set-option -as terminal-features ",xterm*:RGB"' # Focus events enabled for terminals that support them set -g focus-events on # Aggressively resize the chosen window to smallest/largest session 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 # Prevent mouse click up events exiting copy mode unbind -T copy-mode-vi MouseDragEnd1Pane # 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"' # Open a popup with running the default shell bind C-t display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E $SHELL # Open a popup with session creator/switcher bind C-s display-popup -B -w 60 -h 10 -E '~/.config/tmux/session.sh' # Open a popup to pick an interpreter then launch it bind C-i display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E '$SHELL -i ~/.config/tmux/interpreter.sh' # 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 -X begin-selection bind -T copy-mode-vi V send -X select-line bind -n C-v if-shell -F '#{pane_in_mode}' \ 'send -X rectangle-toggle' \ 'send-keys C-v' # Exit copy mode with i/a bind -T copy-mode-vi 'i' send -X cancel bind -T copy-mode-vi 'a' send -X cancel # Search without entering copy-mode first bind '/' 'copy-mode;send-keys /' bind '?' 'copy-mode;send-keys ?' # 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\" " # Enable setting clipboard with OSC-52 when in an SSH session if -b '[ "$SSH_TTY" != "" ]' \ 'set-option -g set-clipboard on' # Yank to the system clipboard in copy mode. # TODO: reattach-to-user-namespace not necessary with tmux > 2.6 if -b '[ "`uname`" = "Darwin" ]' \ 'bind -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy"' # When not in WSL2 use xsel, when in WSL use win32yank.exe to avoid UI lockups. if -b '[ "$WSLENV" = "" ]' \ 'bind -T copy-mode-vi y send-keys -X copy-pipe "xsel -i --clipboard"' \ 'bind -T copy-mode-vi y send-keys -X copy-pipe "win32yank.exe -i -crlf"' source-file ~/.config/tmux/theme.tmux