Прокрутка вывода оболочки с помощью мыши в 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.