How to write if statement in .tmux.conf to set different options for different tmux versions?

Based on @ericx’s answer and @thiagowfx’s answer I put the following together which covers many of the listed incompatibilties from version 2.0 onwards:

# Version-specific commands [grumble, grumble]
# See: https://github.com/tmux/tmux/blob/master/CHANGES
run-shell 'tmux setenv -g TMUX_VERSION $(tmux -V | \
                           sed -En "s/^tmux[^0-9]*([.0-9]+).*/\1/p")'

if-shell -b '[ "$(echo "$TMUX_VERSION < 2.1" | bc)" = 1 ]' {
    set -g mouse-select-pane on; set -g mode-mouse on
    set -g mouse-resize-pane on; set -g mouse-select-window on
    set -g message-fg red
    set -g message-bg black
    set -g message-attr bright
    set -g window-status-bg default
    set -g window-status-fg default
    set -g window-status-current-attr bold
    set -g window-status-current-bg cyan
    set -g window-status-current-fg default
    set -g window-status-bell-fg red
    set -g window-status-bell-bg black
    set -g window-status-activity-fg white
    set -g window-status-activity-bg black
}

# In version 2.1 "mouse" replaced the previous 4 mouse options
if-shell -b '[ "$(echo "$TMUX_VERSION >= 2.1" | bc)" = 1 ]' {
    set -g mouse on
}

# UTF8 is autodetected in 2.2 onwards, but errors if explicitly set
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.2" | bc)" = 1 ]' \
    set -g utf8 on
    set -g status-utf8 on
    set -g mouse-utf8 on
}

# bind-key syntax changed in 2.4 -- selection / copy / paste
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.4" | bc)" = 1 ]' {
    bind-key -t vi-copy v   begin-selection
    bind-key -t vi-copy V   send -X select-line
    bind-key -t vi-copy C-v rectangle-toggle
    bind-key -t vi-copy y   copy-pipe 'xclip -selection clipboard -in'
}

# Newer versions
if-shell -b '[ "$(echo "$TMUX_VERSION < 2.9" | bc)" = 1 ]' {
    bind-key -T copy-mode-vi v   send -X begin-selection
    bind-key -T copy-mode-vi V   send -X select-line
    bind-key -T copy-mode-vi C-v send -X rectangle-toggle
    bind-key -T copy-mode-vi y   send -X copy-pipe-and-cancel 'xclip -selection clipboard -in'
}

if-shell -b '[ "$(echo "$TMUX_VERSION >= 2.9" | bc)" = 1 ]' {
    set -g message-style fg=red,bg=black
    set -g message-style bright
    set -g window-status-style          fg=default,bg=default
    set -g window-status-current-style  fg=default,bg=cyan,bold
    set -g window-status-bell-style     fg=red,bg=black
    set -g window-status-activity-style fg=white,bg=black
}

I raised an issue about the problems with tmux‘s non-backward-compatibility here. The summary is that the tmux devs will not support backward compatibility, nor will they adopt a version numbering scheme which highlights which versions contain breaking changes. 😢

I raised an issue to support numeric comparators for %if which was implemented in v3.0.

Leave a Comment