Прокручуйте вихід оболонки мишею в tmux


256

Прокрутка миші не працює в tmux так, як це працює, коли я запускаю оболонку без tmux (у терміналі Gnome). Здається, tmux надсилає події прокрутки миші так, ніби я натискав клавіші вгору / вниз. Але я хочу, щоб він прокручувався, хоча історія виводу оболонки . Чи є спосіб зробити так, щоб tmux працював так?

Примітка. Я знаю, як прокручувати клавіатуру (завдяки іншому питанню тут).

Я спробував прокручування миші у двох версіях tmux:


1
Я думаю, що відповідь bukzor вирішує вашу проблему для tmux 1.5 і новіших.
kynan

Відповіді:


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
Allan Nienhuis

7
Чи не працює для мене на OS X.
Ain

2
@Ain - Зараз існує 11 основних версій OS X. Про яку саме мову ми говоримо саме?
Рамхаунд

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
Махді

1
приголомшливо - це навіть працює на cygwin - tmux на WINDOWS 7
GWD

@Mahdi Це, здається, не працює на OSX. Якісь підказки?
DiTTiD

2
bindМабуть, більше не потрібен на tmux 2.3
Theron

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

63

Поточна версія tmux (1.5) дозволяє просто увімкнути параметр режим миші та дозволяє прокручувати колесо миші.

         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?
kynan

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

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, але я пам’ятаю, що ОП дав відповідь спеціально для використання gnome-terminal.


1
Джед, дякую! Ваша порада працює і в gnome-терміналі. Я спробую деякий час використовувати цю установку. Але це має недолік: прокрутка миші зараз не працює так, як очікувалося в less. Якщо я завантажую lessвсередину tmux, прокрутка миші не прокручує відкритий файл less. Він прокручує весь термінал. Як не дивно, vimповодиться все так, як очікувалося всередині tmuxвашого налаштування.
користувач31494

2
Зауважте, що з tmux 1.5 це витісняється setw -g mode-mouse onопцією, яка робить режим прокрутки прокрутки за допомогою колеса миші.
кинан

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

На жаль, це не працює в iTerm
Suan

Я мав позитивні результати з цього приводу в iTerm 2
Кіт Смілі

5

tmux 2.1 представляє нові прив'язки миші.

Я написав ці вказівки саме сьогодні. Це безперешкодно прив’язує колесо миші до стрілок, коли він не знаходиться у Vim, тому що Vim здатний інтерпретувати необроблені кодові колеса миші (для таких цілей, як вибір того, яке вікно Vim для прокрутки для вас залежно від того, на якій миші закінчено).

Це означає, що ми можемо, нарешті, використовувати мишу лише для перегляду декількох чоловічих сторінок і будь-якого іншого, що приймає клавіші зі стрілками. Ви можете розширити та зв'язати цю 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-terminal виконує деяку акуратну хитрість, перекладаючи події прокрутки миші на клавіші зі стрілками вгору та вниз в умовах обмеженого "звичайного" прокрутки. Наприклад, при перегляді якого - небудь тексту , використовуючи less(це відбувається , зокрема , коли ви читаєте людина), ви можете прокручувати вміст , використовуючи j, k, ключі і стрілок. Але також , з gnome-terminal, ви можете зробити це з допомогою скролінгу миші, завдяки згаданому трюку.

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

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


Дякую за пояснення, ульдко! Але це не допомагає з проблемою прокрутки миші. Так, з вимкненою опцією gnome-terminalприпиняє надсилати потрійну ^[[Aта ^[[Bпри прокручуванні миші. Це приємніше tmux(немає потворного ^[[A^[[A^[[Aв деяких програмах, немає потворного прокручування історії-історії), але тепер lessперестає прокручуватися на прокрутці миші.
користувач31494

1
Українська? (відгадування iперсонажів)
dotancohen

1

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

Налаштована та багатофункціональна реалізація управління мишею для новіших tmuxes. Настійно рекомендується.

Ви, ймовірно, хочете використовувати

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

з ним також.


Я встановив це, але більше не в змозі виділити та копіювати текст мишкою. Чи можете ви це зробити?
Jonathanking

Так, у вас, ймовірно, присутній інший конфігуратор tmux, пов'язаний з мишею, який конфліктує з ним.
Стівен Лу

0

Ви можете поєднати ідеї прив'язки з іншими відповідями, щоб отримати досить задовольняючу поведінку прокрутки: працює в vim змінах режиму копіювання автоматично в термінал і виходить з нього, коли ви досягнете нижньої частини, все ще дозволяє використовувати мишачий колесо в man, менше і 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'

я додав клавіші відправлення кілька разів, тому одна галочка на колесі миші буде прокручувати 4 рядки одночасно


0

Якщо ви вже перебуваєте на сесії tmux, ви можете запустити команду

set mouse on

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.