While display-popup was added in 3.2 the -B, -b, and -S flags were not introduced until 3.3. This adds fallback bindings which forego these flags to retain functionality at the cost of aesthetics.
166 lines
5.8 KiB
Bash
166 lines
5.8 KiB
Bash
# 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 '~/.config/tmux/check-version.sh "<" 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 ] && ~/.config/tmux/check-version.sh "<" 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'
|
|
|
|
# Binding to create window-auto layout
|
|
bind a run-shell ~/.local/share/tmux/layouts/window-auto
|
|
# TODO: bind A run-shell ~/.local/share/tmux/layouts/window-auto --refresh
|
|
|
|
# Set only on macOS where it's required
|
|
if -b '[ "`uname`" = "Darwin" ]' \
|
|
'set -g default-command "reattach-to-user-namespace -l $SHELL"'
|
|
|
|
if -b '~/.config/tmux/check-version.sh ">=" 3.2 && ~/.config/tmux/check-version.sh "<" 3.3' {
|
|
bind T display-popup -d '#{pane_current_path}' -E $SHELL
|
|
bind S display-popup -w 60 -h 10 -E '~/.config/tmux/session.sh'
|
|
bind P display-popup -w 60 -h 10 -E '~/.config/tmux/project.sh'
|
|
bind I display-popup -d '#{pane_current_path}' -E '$SHELL -i ~/.config/tmux/interpreter.sh'
|
|
}
|
|
if -b '~/.config/tmux/check-version.sh ">=" 3.3' {
|
|
bind T display-popup -S fg=#54546D -d '#{pane_current_path}' -E $SHELL
|
|
bind S display-popup -B -w 60 -h 10 -E '~/.config/tmux/session.sh'
|
|
bind P display-popup -B -w 60 -h 10 -E '~/.config/tmux/project.sh'
|
|
bind 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
|
|
|
|
# Kill current window
|
|
bind W kill-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
|