tmux/tmux.conf
Kenneth Benzie (Benie) 1e2c00aa32 Change default term
While using `tmux-256color` has been working great for the longest time,
`git` on macOS Venture with Apple Silicon does not like it. Complaints
of incorrectly configured terminal are resolved in this config by
removing this custom termdb entry. Alternative would be to install it
again but it doesn't seem to be necessary anymore.
2022-12-10 15:30:10 +00:00

158 lines
5.4 KiB
Bash

# 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
# 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 "xterm-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
# 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"'
# 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.
# 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"'
# Left status style
if -b '[ "$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