Прокрутка вывода оболочки с помощью мыши в tmux


256

Прокрутка мышью не работает в tmux так, как она работает, когда я запускаю shell без tmux (в Gnome Terminal). Кажется, tmux отправляет события прокрутки мыши, как будто я нажимаю клавиши «Вверх / Вниз». Но я хочу, чтобы он прокручивал историю вывода оболочки . Есть ли способ заставить tmux работать так?

Примечание: я знаю, как прокручивать с помощью клавиатуры (спасибо еще один вопрос здесь).

Я пробовал прокрутку мышью в двух версиях tmux:


1
Я думаю, что ответ Букзора решит вашу проблему для Tmux 1.5 и новее.
Кинан

Ответы:


252

Для прокрутки истории выходных данных вы должны использовать ^b+. [ Затем вы можете использовать M + V для перехода вверх и ^ V для перехода вниз. Я не знаю, можно ли использовать реальное PgUpи PgDownхотя. Мой терминал не отправляет эти ключи в tmux. Вместо этого он прокручивает себя, а не историю Tmux.

Для выхода из режима копирования нажмите ESC

Чтобы использовать мышь в этом режиме (называемом режимом копирования), нажмите ^b+ : и введите следующее:

setw -g mouse on

Примечание: в tmux <2.1 опция была названа mode-mouse, а неmouse

Теперь, когда вы переходите в режим копирования, вы можете использовать мышь для его прокрутки. Вы можете поместить эту команду в ваш ~ / .tmux.conf, если хотите, чтобы она загружалась каждый раз, когда вы запускаете tmux.

Обновление: Начиная с tmux 1.5, эта опция заставляет колесо прокрутки автоматически переключаться в режим копирования и прокручивать обратно буфер прокрутки tmux. Больше не нужно сначала нажимать Ctrl-B+ [. Прокрутка вниз до приглашения также автоматически завершает режим копирования.


1
Обратите внимание, что вам, возможно, придется перезагрузить файл конфигурации, если у вас уже есть работающий сервер tmux. blog.sanctum.geek.nz/reloading-tmux-config tmux source-file ~ / .tmux.conf
Аллан Нинхис

7
Не работает для меня на OS X.
Ain

2
@Ain - Сейчас существует 11 основных версий OS X. О какой именно версии мы говорим?
Ramhound

10
Для tmux> = 2.1 смотрите ответ @ DannyRe (в настоящее время довольно далеко внизу).
Joelostblom

3
set -g mouse onу меня работал на macOS tmux 2.1
Мигель Мота

123

Есть некоторые изменения для Tmux 2.1

  • Мышь-режим был переписан. Там больше нет вариантов для:

    • мыши изменить размер-панель
    • мыши выбрать-панель
    • мыши выбрать окна
    • Режим мыши

    Вместо этого есть только одна опция: «мышь», которая полностью включает поддержку мыши.

Это было бы

set -g mouse on
# to enable mouse scroll, see https://github.com/tmux/tmux/issues/145#issuecomment-150736967
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"

6
Спасибо, теперь выбор панелей и т. Д. Работает, а прокрутка - нет. Чтобы сделать прокрутку снова, используйте это: github.com/NHDaly/tmux-scroll-copy-mode
Mahdi

1
потрясающе - это даже работает на cygwin - tmux на WINDOWS 7
GWD

@ Махди Это, кажется, не работает на OSX. Есть намеки?
DiTTiD

2
bindВ tmux 2.3 больше нет необходимости
Theron Luhn

2
+1 За set -g mouse on. Предыдущий комментарий правильный. Связка больше не нужна.
Дакусан,

63

Текущая версия tmux (1.5) позволяет вам просто включить опцию mode-mouse и прокручивать колесико мыши.

         mode-mouse [on | off]
                 Mouse state in modes.  If on, the mouse may be used to
                 enter copy mode and copy a selection by dragging, to
                 enter copy mode and scroll with the mouse wheel, or to
                 select an option in choice mode.

В моем .tmux.conf:

set-window-option -g mode-mouse on

Это поведение, которое вы действительно хотите! Прокрутка мышью, включающая режим копирования, а не просто прокрутка альтернативного буфера оболочки. Это был наконец стимул для меня перейти с экрана на tmux . Есть ли возможность получить то же поведение с Shift + PgUp?
Кинан

1
@kynan: я лично просто нажимаю, C-A PgUpчтобы сделать это. Вы можете связать ключ страницы прямо с tmux bind-key -n PPage copy-mode -u. Подобный thign должен работать для shift + pageup, если вы отсоединяете его от локального терминала.
Букзор

1
Это приводит к странному поведению, когда при прокрутке назад к командной строке я получаю дополнительный символ, вставленный в CLI, что обычно приводит к искажению моей первой команды. Это довольно раздражает.
Крис Р

Обратите внимание, что, хотя это отлично работает для запуска прокрутки с помощью мыши, это вызывает странное поведение при выделении текста, который будет вставлен с помощью среднего щелчка. Я закончил тем, что предпочел Cb pg-up / down (по умолчанию), так как компромисс не был приемлемым.
h7r

@ChrisR Я тоже это понимаю, и это не совсем соответствует. Это [M [M # [M [M # [M [M # [M [M # [M] тип строки?
Элайджа Линн

53

Попробуйте это в вашем .tmux.conf

# Make mouse useful in copy mode
setw -g mode-mouse on

# Allow mouse to select which pane to use
set -g mouse-select-pane on

# Allow xterm titles in terminal window, terminal scrolling with scrollbar, and setting overrides of C-Up, C-Down, C-Left, C-Right
set -g terminal-overrides "xterm*:XT:smcup@:rmcup@:kUP5=\eOA:kDN5=\eOB:kLFT5=\eOD:kRIT5=\eOC"

# Scroll History
set -g history-limit 30000

# Set ability to capture on start and restore on exit window data when running an application
setw -g alternate-screen on

# Lower escape timing from 500ms to 50ms for quicker response to scroll-buffer access.
set -s escape-time 50

Взято из http://brainscraps.wikia.com/wiki/Extreme_Multitasking_with_tmux_and_PuTTY


+1 за escape-timeнастройку
Дакусан

Для всех, кому интересно, файл .tmux.conf находится в вашем домашнем каталоге.
user2647513

15

Кто-то (из источника, который я потерял) предложил добавить следующее ~.tmux.conf:

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

Я понятия не имею, как это работает или что делает, но теперь это позволяет мне прокручивать колесико мыши внутри сеанса tmux, не заходя в режим копирования tmux; Я просто прокручиваю колесо и БАМ! оно работает. Обратите внимание, что я использую Terminal.app, но я помню, что OP дал ответ специально для использования с gnome-terminal.


1
Джед, спасибо! Ваш совет работает и в гном-терминале. Я постараюсь использовать эту настройку в течение некоторого времени. Но у него есть недостаток: прокрутка мышью теперь работает не так, как ожидалось less. Если я загружаю lessизнутри tmux, прокрутка мышью не прокручивает файл, открытый в less. Прокручивает весь терминал. Странно, vimведет себя как положено внутри tmuxс вашей настройкой.
user31494

2
Обратите внимание, что в tmux 1.5 это заменено setw -g mode-mouse onпараметром, который выполняет прокрутку в режиме копирования с помощью колесика мыши.
Кинан

3
Объяснение заключается в том, что эта опция отключает блокировку прокрутки на альтернативном экране терминала, что желательно в большинстве случаев, поскольку приложения, запрашивающие буфер альтернативного экрана (vi, less, tmux и т. Д.), Предоставляют свои собственные возможности прокрутки. Переопределение этой блокировки в tmux позволяет прокручивать альтернативный экранный буфер терминала, который не дает желаемого результата во всех случаях, кроме нескольких. Смотрите этот ответ для цитаты из man xtermобъяснения альтернативного экрана.
Кинан

Увы, это не работает в iTerm
Suan

У меня были положительные результаты с этим в iTerm 2
Кит Смайли

5

Tmux 2.1 представляет новые привязки мыши.

Я написал эти связки только сейчас сегодня. Он плавно связывает колесо мыши со стрелками, когда не в Vim, потому что Vim способен интерпретировать необработанные коды колеса мыши (для таких целей, как выбор окна Vim для прокрутки, в зависимости от того, над какой мышью вы надели).

Это означает, что мы, наконец, можем использовать мышь только для просмотра нескольких страниц man и всего, что принимает клавиши со стрелками. Вы можете расширять и связывать ifлогику по мере необходимости, чтобы реализовать больше логики для ваших приложений.

bind -n WheelUpPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Up"
bind -n WheelDownPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Down"

С этой новой возможностью привязки колес можно настроить скрипт колесика мыши на любое контекстно-зависимое поведение, которое вам нравится.


Сейчас я просто как бы играю над тем, чтобы заставить колесо мыши на границе панели сделать что-то интересное. Вероятно, я сделаю не карту колеса на границе, а карту для циклического перемещения окон tmux, когда это будет сделано по строке состояния.
Стивен Лу

Какая ссылка на ваш Github? Я хотел бы быть в курсе ваших усилий! Еще одна особенность, которую я ищу, - это дважды щелкнуть мышью, чтобы скопировать слово в буфер обмена X, как это происходит вне Tmux.
Joeytwiddle

@joeytwiddle Я очень рекомендую github.com/NHDaly/tmux-better-mouse-mode , см. мой другой ответ
Стивен Лу,

3

Gnome-терминал выполняет некоторые хитрые трюки, переводя события прокрутки мыши в клавиши со стрелками вверх и вниз в условиях ограниченной «обычной» прокрутки. Например, при просмотре какого - нибудь текста , используя less(это происходит , в частности , когда вы читаете человек), вы можете прокручивать содержимое , используя j, k, ключи и стрелок. Но также , с помощью gnome-terminal, вы можете сделать это с помощью прокрутки мыши, благодаря упомянутому трюку.

Так что я думаю, tmuxчто некоторые «захваты» терминала точно такие же less- и тот же механизм в gnome-terminalударах: прокрутка мышью переводится в нажатия клавиш со стрелками вверх / вниз.

Вы можете отключить эту функцию в настройках профиля и получать регулярную прокрутку при любых обстоятельствах. Просто пометка последнего флажка на вкладке «прокрутки»: флажок.


Спасибо за объяснение, Ульдтко! Но это не помогает с проблемой прокрутки мыши. Да, при отключенной опции gnome-terminalпрекращается отправка тройного сообщения ^[[Aи ^[[Bпри прокрутке мыши. Это лучше tmux(без уродства ^[[A^[[A^[[Aв некоторых программах, без уродливой прокрутки истории команд), но теперь lessперестает прокручиваться при прокрутке мышью.
user31494

1
Украинский? (угадывая по iперсонажам)
dotancohen

1

https://github.com/NHDaly/tmux-better-mouse-mode

Конфигурируемая и многофункциональная реализация управления мышью для новых tmux. настоятельно рекомендуется.

Вы, вероятно, хотите использовать

set -g @emulate-scroll-for-no-mouse-alternate-buffer "on"

с этим также.


Я установил это, но больше не могу выделять и копировать текст с помощью мыши. Вы можете сделать это?
Джонатанкинг

Да, скорее всего, у вас есть другой связанный с мышью конфиг tmux, который конфликтует с ним.
Стивен Лу

0

Вы можете объединить идеи связывания из других ответов, чтобы получить довольно удовлетворительное поведение при прокрутке: работает в vim, автоматически переключается в режим копирования в терминале и выходит из него, когда вы достигаете дна, все еще позволяет вам использовать колесико мыши в man, less и journalctl.

Мой код:

bind -n WheelUpPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Up Up Up Up"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"
bind -n WheelDownPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Down Down Down Down"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"

Вы можете добавить другие команды, для которых требуются клавиши со стрелками для прокрутки в grep -e 'man' часть

я добавил send-keys несколько раз, поэтому один тик на колесе мыши будет прокручивать 4 строки за раз


0

Если вы уже находитесь в сеансе tmux, вы можете запустить команду

set mouse on

Напоминание: для запуска команд используйте свой префикс :.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.