5

Я заметил, что прокрутка в tmux - проблема, и мне было интересно, можно ли было заставить tmux передавать их в приложение или терминал.

Возможно, я здесь неправильно понимаю, но я заметил, что я могу прокручивать справочные страницы в терминологии (мой эмулятор терминала), но не во время работы tmux. Прокрутка мышью на страницах man не работает в xterm, даже если tmux не запущен, что заставляет меня думать, что терминал обрабатывает событие мыши, а затем отправляет их в приложение.

Итак, мое текущее понимание потока событий мыши таково:

terminal -> tmux

Таким образом, проблема заключается в том, что tmux блокирует события от попадания в основное приложение. Что нужно, так это:

terminal -> tmux -> application

В идеале я бы совмещал собственную прокрутку терминологии с режимом копирования tmux (данный режим мыши был включен, и он автоматически входил и выходил из режима копирования), но это не представляется возможным, поскольку tmux обрабатывает прокрутку самостоятельно.

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

Так возможно ли, чтобы tmux просто полностью игнорировал сигналы мыши и отправлял их в базовый терминал или приложение?

4 ответа4

5

Если вы просматриваете страницу руководства непосредственно в терминологии, происходит следующее:

less (ручной пейджер) переключает терминал на так называемый альтернативный экран, который не имеет буфера обратной прокрутки и из которого при выходе из приложения вы возвращаетесь к предыдущему содержимому терминала. Этот режим обычно используется полноэкранными приложениями (программами просмотра, редакторами, файловыми менеджерами и т.д.).

less не способен обрабатывать мышь вообще, и terminology прекрасно понимает, что работающее внутри приложения не заинтересовано в событиях мыши.

Когда terminology (фактически большинство эмуляторов терминала) понимает, что эти два условия соблюдены (то есть альтернативный экран, не интересуется мышью), она преобразует события прокрутки в нажатия клавиш вверх и вниз. Поэтому less не видит никаких событий мыши, а видит только нажатия клавиш.


Теперь давайте поместим tmux между ними.

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

С другой стороны, tmux сам по себе является эмулятором терминала, как и terminology . Он отслеживает (для каждого окна / панели), интересуется ли запущенное там приложение мышью, и переключилось ли приложение на альтернативный экран. Эти состояния не отражаются на terminology , это частный бизнес tmux .

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

Это, вероятно, функция, которая отсутствует в tmux , и я рекомендую вам подать запрос на функцию против них.


Давайте усложним ситуацию, если вас интересуют сочные детали. Давайте сейчас возьмем tmux .

Здесь стоит отметить небольшую проблему. При использовании обычной мыши колесо прокрутки обычно генерирует более 1 нажатия клавиш, возможно, около 3-5, потому что в противном случае прокрутка была бы слишком медленной. Сенсорные панели могут сообщать о гораздо более плавных координатах, некоторые эмуляторы терминала (включая terminology) распознают их и, следовательно, сообщают нажатия клавиш вверх / вниз по очереди (скажем, одно нажатие клавиши после каждой 1/3 единицы прокрутки, единица означает, что такое колесо мыши сделал бы сразу). (У меня сейчас нет мыши, поэтому я не могу проверить, что terminology с мышью действительно переходит на несколько строк, но я предполагаю, что это так.)

Сообщать о нескольких нажатиях клавиш не имеет смысла в некоторых обстоятельствах, например, при поиске less он возвращает, возможно, 3 записи истории одновременно, это абсолютно бесполезно и является хорошей демонстрацией того, что это действительно происходит за сцены. С эмулятором терминала, таким как terminology плюс тачпад, это не проблема, если приложение не заботится о мышке, поэтому вы можете прокручивать построчно, например, less . Однако, если приложение заботится о мышке, вы возвращаетесь к грубому процессу прокрутки, потому что протокол мыши внутри терминалов не может сообщить о мелкой детализации, только по старомодному блоку прокрутки мыши. Например, в mcview вы не можете плавно прокручиваться, только несколькими строками одновременно.

Давайте tmux обратно в игру. Это приложение, поддерживающее мышь на альтернативном экране, так же, как и mcview , поэтому оно может получать только события прокрутки мышью старомодных больших устройств. Предположительно, он должен отправлять несколько нажатий клавиш вверх / вниз одновременно, так же, как фактические эмуляторы терминала делают на устаревших скроллах мыши, иначе прокрутка будет невыносимо медленной. Таким образом, даже если разработчики tmux реализовывать эту функцию, вы потеряете плавность прокрутки.

Я открыл ошибку https://bugzilla.gnome.org/show_bug.cgi?id=755183, чтобы поработать над ее улучшением, но пока что никакой реальной работы сделано не было.

2

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

# Emulate scrolling by sending up and down keys if these commands are running in the pane
tmux_commands_with_legacy_scroll="nano less more man"

bind-key -T root WheelUpPane \
    if-shell -Ft= '#{?mouse_any_flag,1,#{pane_in_mode}}' \
        'send -Mt=' \
        'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
            "send -t= Up Up Up" "copy-mode -et="'

bind-key -T root WheelDownPane \
    if-shell -Ft = '#{?pane_in_mode,1,#{mouse_any_flag}}' \
        'send -Mt=' \
        'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
            "send -t= Down Down Down" "send -Mt="'

Ответ egmont точен и привел меня к этому обходному пути.

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

0

Если кто-то придет сюда в попытке найти практическое решение для прокрутки как в консольных приложениях, ориентированных на мышь, так и в невежественных мышах, обратитесь к этому ответу: https://superuser.com/a/1154016/438273

0

Если вы работаете в OS X, установите MouseTerm с SIMBL (простой загрузчик плагинов).

Затем настройте .tmux.conf следующим образом (для Tmux 2.0 новые версии могут отличаться):

  • установить -g mode-mouse on
  • установите -g mouse-resize-pane на
  • установить -g mouse-select-pane on
  • установите -g mouse-select-window на

Я обнаружил, что использование клавиши «Option» на моем Macbook Pro под управлением Yosemite включит выделение «вырезать / вставить».

Вот хорошая статья о процессе / подводных камнях:

Включить поддержку мыши в Tmux на OS X

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .