Как написать оператор if в .tmux.conf, чтобы установить разные параметры для разных версий tmux?

У меня есть .tmux.conf, который я использую на разных машинах с установленными разными версиями tmux.

Я хочу установить разные параметры мыши в зависимости от версии tmux. На одной машине у меня версия 2.0, на другой 2.1.

Я не понимаю его часть правильно

if "[[(( $(tmux -V | cut -c 6-) < 2.1 ))]]" \
  "set -g mode-mouse on;" \
  "set -g mouse-resize-pane on;" \
  "set -g select-pane on;" \
  "set -g select-window on" "set -g mouse on"

Когда я получаю файл

$ tmux source-file .tmux.conf

я получаю это сообщение

.tmux.conf:12: unknown command: set -g mouse-resize-pane on

Машина, на которой я ее запускаю, имеет версию 2.1, поэтому она не должна устанавливать четыре параметра.

Я хочу установить четыре параметра при запуске tmux 2.0 или менее или один вариант при запуске tmux 2.1.

Этот оператор bash работает

$ tmux -V
tmux 2.1
$ if [[(( $(tmux -V | cut -c 6-) < 2.1 ))]];then echo $?;else echo $?;fi
1

person mrt181    schedule 26.01.2016    source источник
comment
Почему в этом тесте есть и [[ ]], и (( ))? Я думаю, что (( )) будет достаточно, если предположить, что if (то есть if-shell?) проверяет код возврата.   -  person Etan Reisner    schedule 26.01.2016
comment
исправление оператора if до if "(( $(tmux -V | cut -c 6-) < 2.1 ))" "set -g mode-mouse on; set -g mouse-resize-pane on; set -g select-pane on; set -g select-window on" устраняет проблему. Можете ли вы опубликовать свой комментарий в качестве ответа.   -  person mrt181    schedule 27.01.2016
comment
На самом деле (( )) не может обрабатывать десятичные числа, поэтому, если это работает, это другая причина (или случайность). Есть ли у tmux способ проверить функции? (Я предполагаю, что вы хотите, чтобы это было включено только в версиях, которые его поддерживают.)   -  person Etan Reisner    schedule 27.01.2016
comment
Я не знаю, может ли tmux тестировать функции, я новичок в tmux.   -  person mrt181    schedule 27.01.2016
comment
Обнаружение ОС: superuser.com/questions/539595/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 06.07.2016


Ответы (11)


На основе @ericx answer и Ответ @thiagowfx Я собрал следующее вместе, которое охватывает многие из перечисленных несовместимостей начиная с версии 2.0:

# 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"

Я поднял вопрос о проблемах с необратимой совместимостью tmux здесь. Подводя итог, можно сказать, что разработчики tmux не будут поддерживать обратную совместимость и не будут использовать схему нумерации версий, которая выделяет, какие версии содержат критические изменения. ????

Я поднял вопрос о поддержке числовых компараторов для %if, который был реализовано в версии 3.0.

person Tom Hale    schedule 01.12.2016
comment
Спасибо, Том, это здорово. Я добавил благодарность в свой репозиторий github.com/sixarm/sixarm_tmux_dotfiles. - person joelparkerhenderson; 10.02.2017
comment
Как человек, который использует одни и те же dotfiles в OSX и 2-3 разных Linux-боксах, я не могу вас отблагодарить! Этот ответ кажется наиболее универсальным из всех. - person Andrei Bârsan; 09.05.2017
comment
это указано ниже в ответе Мики, но у меня были проблемы из-за отсутствия здесь точки с запятой перед обратной косой чертой (все это интерпретировалось как одна длинная команда). Спасибо за пример! - person Tony Clifton; 19.09.2018
comment
@TonyClifton Действительно, не только отсутствующие точки с запятой вызывают проблемы, но и все, что находится за первым символом комментария (#), в моем случае игнорировалось ... - person Griddo; 10.11.2018
comment
@Griddo спасибо за редактирование. Я обновился на основе версии 2.9, но, поскольку у меня не было проблем, с которыми вы столкнулись, я был бы признателен за ваш отзыв. Какую версию вы используете, что мешает # и отсутствию ;? - person Tom Hale; 10.05.2019
comment
@TomHale В настоящее время я использую v2.6 в Linux Mint, а также что-то › v2.4, а также v2.8 в WSL debian. См. этот минимальный пример, который точно воспроизводит две ошибки. - person Griddo; 17.05.2019
comment
Следует отметить, что эти проверки версии не будут работать, если в релизной версии есть буквы и другие символы. В духе FU SEMVER от tmux я предлагаю два последних выпуска на GitHub, которые не поддаются этим проверкам версий: 2.9a и 3.0-rc3. github.com/tmux/tmux/releases - person danemacmillan; 27.06.2019
comment
Спасибо за предупреждение @danemacmillan. Их управление выпуском — FUBAR. Я обновил с одним sed -n. - person Tom Hale; 27.06.2019
comment
@TomHale Эта строка sed намного лучше, но вы забыли передать ее. Беру, спасибо! - person danemacmillan; 27.06.2019
comment
@danemacmillan Пожалуйста, не стесняйтесь использовать ссылку edit, чтобы улучшить любой ответ на этом сайте! :) - person Tom Hale; 29.06.2019
comment
@TomHale, строка setenv не работает для значения версии tmux.orig 2.8. sed -En "s/^tmux.* ... работает. - person raychi; 13.06.2020
comment
@raychi Извините, но я не совсем понимаю. Пожалуйста, предложите правку. - person Tom Hale; 27.06.2020
comment
@TomHale, My tmux -V возвращает строку tmux.orig 2.8. Это значение не работает с командой sed run-shell. Измените шаблон sed на s/^tmux.* .... (добавьте .* после tmux). Предложение редактирования не сработало, так как изменение должно состоять из 6 символов, а у меня всего 2 символа :) - person raychi; 29.06.2020
comment
текущий заголовок master имеет строку версии: tmux next-3.3 шаблон в ответе не сработал, (другой) подходящий шаблон для sed: bash sed -En "s/^tmux[^0-9]*([.0-9]+).*/\1/p" Я прочитал вашу связанную проблему и разделяю ваше разочарование отношением сопровождающих к semver. Как вы заметили, 23 минуты исправления .conf для одного разработчика — это тысячи совокупных человеко-часов для всей пользовательской базы. - person Matthew Strasiotto; 08.09.2020
comment
Эй, просто в связи с этим, один из способов очистить ваш tmux.conf, который реализует это, чтобы он был немного более СУХИМ: вы можете хранить свои тестовые строки оболочки в tmux env vars, (начиная с версии 0.8 в 2008 г.) и интерполировать их во время выполнения для if-shell: V33_GTE='[ "$(echo "$TMUX_VERSION >= 3.3" | bc)" = 1 ]' V33_LT='[ "$(echo "$TMUX_VERSION < 3.3" | bc)" = 1 ]' if "$V33_GTE" bind -N "Mouse mode off" M - person Matthew Strasiotto; 11.09.2020
comment
@MatthewStrasiotto Извините, я не понимаю, какое повторение это удаляет? - person Tom Hale; 11.09.2020
comment
@TomHale вместо того, чтобы копировать-вставлять и оценивать один и тот же тест оболочки, вы копируете и вставляете env-var, в котором хранится тест и его оценка. Польза на самом деле мизерная - person Matthew Strasiotto; 01.10.2020
comment
Чтобы не использовать bc (который не установлен на некоторых машинах, в которые я часто вхожу удаленно), я делал так: run-shell "tmux setenv -g TMUX_VERSION $(tmux -V | sed -E 's/^[^0-9]*//; s/[^0-9]*$//' | awk -F. '{ printf \"%d.%02d\", $1, $2 }')", а затем if-shell 'bash -c "if [[ $TMUX_VERSION < 1.09 ]]; then :; else false; fi"' '...'. То есть я форматирую версию так, чтобы ее можно было сравнить лексикографически, и использую обычные операторы bash < и > для сравнения их как строк. Он работает на tmux 1.8, 2.1 и 3.1b, но я еще не проверял полностью. - person wisnij; 27.10.2020

if-shell не всегда работает. Вместо этого я использую сценарий оболочки для загрузки правильной версии tmux.conf:

В .tmux.conf:

run-shell "bash ~/.tmux/verify_tmux_version.sh"

В файле verify_tmux_version.sh:

#!/bin/bash

verify_tmux_version () {
    tmux_home=~/.tmux
    tmux_version="$(tmux -V | cut -c 6-)"

    if [[ $(echo "$tmux_version >= 2.1" | bc) -eq 1 ]] ; then
        tmux source-file "$tmux_home/tmux_2.1_up.conf"
        exit
    elif [[ $(echo "$tmux_version >= 1.9" | bc) -eq 1 ]] ; then
        tmux source-file "$tmux_home/tmux_1.9_to_2.1.conf"
        exit
    else
        tmux source-file "$tmux_home/tmux_1.9_down.conf"
        exit
    fi
}

verify_tmux_version

Подробнее: https://gist.github.com/vincenthsu/6847a8f2a94e61735034e65d17ca0d66

person Vincent Hsu    schedule 30.04.2016
comment
Этот bc хак хардкорный. - person Ciro Santilli 新疆再教育营六四事件ۍ 10.07.2016
comment
Управление конфигурацией — это уже нетривиальное управление 3 конфигурационными файлами. Разработчики tmux часто вносят несовместимости и, вероятно, продолжат это делать. Я предпочитаю решение, использующее только .tmux.conf, которое я основал на этом ответе. - person Tom Hale; 01.12.2016
comment
Я попробовал решение if-shell, но не могу найти способ правильно определить номера версий на моих 3 машинах (Ubuntu 14.04 (tmux 1.8), Ubuntu 16.04 (tmux 2.1) и macOS Sierra (tmux 2.3)). Поэтому я предпочитаю вызывать bash напрямую. Я был бы счастлив, если бы кто-то заработал только один .tmux.conf. - person Vincent Hsu; 14.12.2016

Это какая-то суета. Правильный способ сделать это внутри tmux (не полагаясь на внешний сценарий оболочки) сочетает в себе функции ответов Винсента и jdloft.

Команда if-shell в tmux используется как

if-shell [-bF] [-t target-pane] shell-command command [command]
               (alias: if)
    Execute the first command if shell-command returns success or the second command otherwise.  Before
    being executed, shell-command is expanded using the rules specified in the FORMATS section, including
    those relevant to target-pane.  With -b, shell-command is run in the background.

    If -F is given, shell-command is not executed but considered success if neither empty nor zero (after
         formats are expanded).

Обратите внимание, что расширение команды оболочки tmux расширит переменные формы #{pane_current_path}, но в противном случае оставит команду в покое.

Что еще более важно, обратите внимание, что tmux использует /bin/sh -c для выполнения команды оболочки мы уточняем. Таким образом, команда должна быть POSIX-совместимой, поэтому тесты формы [[ не гарантируют быть портативным. Современные системы Ubuntu и Debian, например, используют символическую ссылку /bin/sh на dash.

Мы хотим запустить команду оболочки, совместимую с POSIX, которая проверяет версию tmux и возвращает 0 (true), если нужная версия найдена.

if-shell '[ $(echo "$(tmux -V | cut -d" " -f2) >= 2.1" | bc) -eq 1 ]' \
    'command if true' \
    'command if false'

Пример:

if-shell '[ $(echo "$(tmux -V | cut -d" " -f2) >= 2.1" | bc) -eq 1 ]' \
    'set -g mouse on; set -g mouse-utf8 on' \
    'set -g mode-mouse on; set -g mouse-resize-pane on; set -g mouse-select-pane on; set -g mouse-select-window on' 

Это правильно учитывает тот факт, что мы выполняем арифметику с плавающей запятой, поэтому требуется bc . Кроме того, нет необходимости в конструкции if/then/else/fi, поскольку оператор [ сам создает истинное значение.

Пара заметок

  • Строки, продолжающиеся на следующую строку, не могут иметь завершающие комментарии, иначе tmux выдаст сообщение об ошибке «неизвестная команда».
  • «Команда, если ложь» может быть опущена.
  • Несколько команд для истинного или ложного можно комбинировать с помощью ;
  • Команда запускается в базовой оболочке с использованием /bin/sh -c. Работа других подходов, использующих [[ или другой синтаксис, отличный от POSIX, не гарантируется.

EDIT: в предыдущей версии этого ответа использовалось [[, которое не работает в системах, не использующих bash. Замена на [ решает эту проблему.

person Micah Smith    schedule 13.10.2016
comment
Мне интересно, есть ли способ заставить это работать с вложенными операторами if. - person Carl Patenaude Poulin; 26.11.2016
comment
Я уверен, что вы могли бы @Carl, но ваше цитирование " символов стало бы волосатым. @pana В последнем примере вам понадобится ; между строками 2 и 3. Кроме того, у вас есть mouse дважды. См. мой ответ для примера продолжения внутри продолжения. - person Tom Hale; 01.12.2016
comment
Незначительная гнида: [ это не оператор, это команда. Это важное различие, потому что многие ошибочно принимают [ за часть грамматики оболочки, а это не так. - person William Pursell; 15.08.2018
comment
Это отличный ответ. Я смог добиться того, к чему стремился, и узнал кое-что о tmux и Bash. Спасибо! - person pdoherty926; 31.01.2019

Я также наткнулся на несоответствие конфигурации в разных версиях tmux. Изучив все решения здесь и в этом связанном вопросе о SuperUser, Я реализовал следующий вариант:

# Version-specific configuration can be placed in ~/.tmux/${TMUX_VERSION}/*.conf
run-shell "for conf in ~/.tmux/$(tmux -V | cut -d' ' -f2)/*.conf; do tmux source-file \"\$conf\"; done"

При этом конфигурация для конкретной версии может быть помещена в (несколько) фрагментов конфигурации для конкретной версии. Это похоже на решение @VincentHsu, но:

  • Он не требует внешнего сценария оболочки.
  • Он не делится на фиксированные диапазоны версий (... / 1.9 до 2.0 / 2.1 ...). Вместо этого можно использовать (символические) ссылки для совместного использования фрагмента конфигурации несколькими версиями tmux.
  • Он не жестко кодирует одно имя файла для версии. Разрешая несколько фрагментов конфигурации для каждой версии, части могут быть общими для разных версий, в то время как другие остаются специфичными для каждой версии. Это должно обеспечить максимальную гибкость.
  • В оригинальном ~/.tmux.conf есть только один элемент конфигурации. Другие решения, такие как решение @TomHale, дублируют проверку версии для каждого элемента конфигурации.
person Ingo Karkat    schedule 27.01.2017

На некоторых машинах я получал ложноположительный результат с синтаксисом двойной скобки ('[['). Поэтому я придумал альтернативу, используя awk:

# Enable mouse for different versions of tmux
# (If 'awk' exits with status 0, 'if-shell' evaluates to true)
# tmux < v2.1:
if-shell "tmux -V | awk '{exit !($2 < \"2.1\")}'" \
    "setw -g mode-mouse on ; set -g mouse-select-pane on ; set -g mouse-resize-pane on ; set -g mouse-select-window on ;"
# tmux >= v2.1:
if-shell "tmux -V | awk '{exit !($2 >= \"2.1\")}'" \
    "set -g mouse on ;"
person bdellaterra    schedule 30.12.2016
comment
Блестящее решение, это должен быть принятый ответ! Спасибо (я бы добавил head -1 | после tmux -V | на случай, если позже в его описание добавят больше строк.) - person Krisztian; 01.08.2017
comment
@Krisztian В этом нет необходимости, так как exit уже заставляет awk прекращать обработку в первой строке. - person raimue; 17.04.2018
comment
@raimue, спасибо, я этого не знал, похоже, это действительно работает: echo -e "tmux 2.0-master\ntmux 2.8" | awk '{exit !($2 < "2.1")}' && echo ok || echo no - person Krisztian; 18.04.2018

if-shell Tmux можно использовать для проверки версии ZSH.

[[ `tmux -V | cut -d' ' -f2` -lt 2.1 ]]

проверяет, больше ли версия tmux 2.1 или нет. Используя это, мы можем установить ваши команды мыши в зависимости от версии ZSH.

if-shell "[[ `tmux -V | cut -d' ' -f2` -lt 2.1 ]]" \
    'set -g mode-mouse on; set -g mouse-resize-pane on; set -g mouse-select-pane on; set -g mouse-select-window on'

И установите его для более поздних версий tmux:

if-shell "[[ `tmux -V | cut -d' ' -f2` -ge 2.1 ]]" \
    'set -g mouse on; set -g mouse-utf8 on'
person jdloft    schedule 04.04.2016
comment
Конфигурация if-shell для tmux ‹2.1 не работает. Даже с tmux 2.0 оболочка bash говорит true для if [[ $(tmux -V | cut -d' ' -f2) -lt 2.1 ]]; then echo 'true'; true; else echo 'false'; false; fi, но с if-shell "if [[ $(tmux -V | cut -d' ' -f2) -lt 2.1 ]]; then true; else false; fi" "display true;" "display false;" tmux говорит, что unknown command: display 2. Это означает, что команда shell оценивается как ложная. - person Jongwook Choi; 17.04.2016
comment
У меня такая же проблема. if-shell всегда возвращает ложный результат. Кто-нибудь, пожалуйста, мне? - person Wyntau; 01.08.2016
comment
Это просто не работает. Просто попробуйте запустить [[ `tmux -V | cut -d' ' -f2` -lt 2.1 ]] в bash. Я получаю -bash: [[: 2.2: syntax error: invalid arithmetic operator (error token is ".2"). Причина в том, что эти тестовые операторы не обрабатывают числа с плавающей запятой, для чего вам нужен bc. - person Micah Smith; 13.10.2016
comment
Извините, я тестировал в оболочке Z, которая позволяет использовать такой оператор -lt. Попробуйте заменить его символом «‹» (и символом «›» для обозначения «больше»). - person jdloft; 13.10.2016
comment
Кошка умирает всякий раз, когда кто-то делает только boolean ? true : false вместо boolean - person Shubham Chaudhary; 21.11.2016
comment
Эй, кто-нибудь когда-нибудь заставлял это работать? tmux 'run-shell' жестко закодирован для запуска /bin/sh. Ни один из приведенных выше примеров не работает в /bin/sh. - person Dave; 28.05.2018
comment
sh и bash не позволяют проводить арифметическое сравнение чисел с плавающей запятой. См. этот ответ для решения с использованием настольного калькулятора bc - person Tom Hale; 09.09.2018

Недавно я столкнулся с этой проблемой, и моим решением было написать скрипт tmux-older-than:

#! /bin/bash

TMUX_VERSION="$(tmux -V | cut -d" " -f2)"
test 1 -eq "$( echo "$TMUX_VERSION < $1" | bc)"

Это делает tmux.conf более читабельным:

if-shell 'tmux-older-than 3.0' \
        'bind-key ^P swap-window -t -1' \
        'bind-key ^P swap-window -d -t -1'
person cdleonard    schedule 09.10.2020

Текущая последняя версия - 2.9a, которая отбрасывает многие из используемых здесь прямых сравнений.

В моей альтернативе используется sort -V, который гораздо более надежен для обработки сравнений версий.

Изменить: комментатор указывает, что sort -V недоступен в BSD sort, например, в родной OSX. Однако это все еще ответ, который учитывает версии, которые не являются чисто числовыми.

# ver >= 2.3
[ ! "$(printf "%s\n%s" "$TMUX_VERSION" "2.3" | sort -V | head -n1)" == "$TMUX_VERSION" ]' \
    "command"

# ver > 2.3
[ ! "$(printf "%s\n%s" "$TMUX_VERSION" "2.4" | sort -V | head -n1)" == "$TMUX_VERSION" ]' \
    "command"

# ver < 2.3
[ "$(printf "%s\n%s" "$TMUX_VERSION" "2.3" | sort -V | head -n1)" == "$TMUX_VERSION" ]' \
    "command"
person silico-biomancer    schedule 19.08.2019
comment
будьте осторожны, sort -V не всегда работает, например, он не работает в macOS 10.11, использующем BSD sort - person philb; 16.06.2020
comment
Дратс, это хорошее предостережение. Я обычно устанавливаю сортировку gnu на свои машины с OSX, поэтому пропустил это. Я добавлю предостережение к ответу. - person silico-biomancer; 17.06.2020

Я объединил предложенные решения с рабочим (проверено на tmux 1.8 и 2.7):

run-shell "tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-)"

if-shell -b '[[ "$TMUX_VERSION" < "2.6" ]]' \
  "bind w choose-tree -u"

if-shell -b '[[ "$TMUX_VERSION" < "2.2" ]]' \
  "set -g status-utf8 on"
person e-pirate    schedule 02.05.2019
comment
ваша команда cut вряд ли будет достаточно надежной для разных строк версии. Например, tmux -V в HEAD репозитория равен tmux next-3.3. tmux -V | cut -c 6- дает next-3.3. Также, как указывали другие, тестовые конструкции [[ ]] являются функцией bash, которая не переносится между системами, поскольку единственной гарантированной оболочкой является совместимая с POSIX sh. - person Matthew Strasiotto; 11.09.2020

Это не альтернатива, а скорее расширение принятых ответов (ответ Тома Хейла является наиболее надежным и полным).

Чтобы меньше повторяться в вашем .tmux.conf, вы можете хранить свои тестовые строки оболочки в tmux env vars (доступно с версии 0.8 в 2008 г.) и интерполировать их во время выполнения для if-shell:

# Use which sed pattern actually works in the accepted answers
run-shell 'tmux setenv -g TMUX_VERSION $(tmux -V | sed -En "...")'

# Setup condition checks
V33_GTE='[ "$(echo "$TMUX_VERSION >= 3.3" | bc)" = 1 ]' 
V33_LT='[ "$(echo "$TMUX_VERSION < 3.3" | bc)" = 1 ]'

# So on for other versions
# ...

### Example binding
# Toggle mouse
bind m set -g mouse on  \; display 'Mouse: ON'
bind M set -g mouse off \; display 'Mouse: OFF' 

# As of 3.1 you can annotate your keybindings
# As of 3.3 you can attach a note to existing bindings without setting the binding
# If running >= 3.3 , attach a note to the binding for `list-keys -N`

if "$V33_GTE" bind -N "Enable mouse mode" m
if "$V33_GTE" bind -N "Disable mouse mode" M

person Matthew Strasiotto    schedule 11.09.2020
comment
set -g mouse (без включения и выключения) переключается сам по себе. Попробуйте это: bind-key c-M set-option -g mouse \; display-message 'Mouse #{?mouse,on,off}' - person Elliptical view; 05.12.2020
comment
Я могу изменить ответ, чтобы отразить этот другой подход, но он не имеет отношения к ответу, это пример привязки, зависящей от оператора if-shell, который оценивает интерполированный оператор. - person Matthew Strasiotto; 06.12.2020

У меня такая конфигурация уже много лет.

  • Поддержка таких версий, как tmux 2.4 tmux 2.4a tmux next-3.3
  • Нет команды bc
  • Поддержка Cygwin, macOS и Linux
# Tmux version before 2.4
if-shell -b '[ `tmux -V | cut -d" " -f2 | tr -d " |\-|.|[:alpha:]"` -lt 24 ]' \
  'bind-key -t vi-copy v begin-selection; \
    bind-key -t vi-copy Q cancel; \
    bind-key -t vi-copy Enter cancel'

# Tmux version 2.4 onwards
if-shell -b '[ `tmux -V | cut -d" " -f2 | tr -d " |\-|.|[:alpha:]"` -ge 24 ]' \
  'bind-key -T copy-mode-vi C-w   send-keys -X cancel; \
bind-key -T copy-mode-vi C-u   send-keys -X halfpage-up; \
bind-key -T copy-mode-vi C-j   send-keys -X halfpage-down; \
bind-key -T copy-mode-vi C-l   send-keys -X select-line'
person Green Bird    schedule 22.04.2021