Desplazar salida de shell con mouse en tmux

256

El desplazamiento del mouse no funciona en tmux de la forma en que funciona cuando ejecuto shell sin tmux (en la Terminal de Gnome). Parece que tmux envía eventos de desplazamiento del mouse como si presionase las teclas Arriba / Abajo. Pero quiero que se desplace por el historial de salida del shell . ¿Hay alguna manera de hacer que tmux funcione así?

Nota: Sé cómo desplazarme con el teclado (gracias a otra pregunta aquí).

Intenté desplazarme con el mouse en dos versiones de tmux:

usuario31494
fuente
1
Creo que la respuesta de bukzor resuelve su problema para tmux 1.5 y posteriores.
kynan

Respuestas:

252

Para desplazarse dentro del historial de la salida Debería usar ^b+ [ Luego puede usar M + V para subir de página y ^ V para bajar de página. No sé si puedes usar lo real PgUpy PgDownsin embargo. Mi terminal no envía estas claves al tmux. En cambio, se desplaza solo y no la historia de tmux.

Para salir del modo de copia, presione ESC

Para usar su mouse en este modo (llamado modo de copia) presione ^b+ : e ingrese lo siguiente:

setw -g mouse on

Nota: En tmux <2.1, la opción fue nombrada mode-mouse, y nomouse

Ahora, cuando cambie al modo de copia, puede usar el mouse para desplazarse por él. Puede poner este comando en su ~ / .tmux.conf si lo desea para que se cargue cada vez que ejecute tmux.

Actualización: a partir de tmux 1.5, esta opción hace que el uso de la rueda de desplazamiento cambie automáticamente al modo de copia y retroceda el búfer de desplazamiento tmux. Ya no es necesario golpear primero Ctrl-B+ [. Desplazarse hacia abajo hasta el indicador también finaliza el modo de copia automáticamente.

Pavlo
fuente
1
Tenga en cuenta que es posible que deba volver a cargar el archivo de configuración si ya tiene un servidor tmux en ejecución. blog.sanctum.geek.nz/reloading-tmux-config tmux source-file ~ / .tmux.conf
Allan Nienhuis
77
No funciona para mí en OS X.
Ain
2
@Ain: ahora hay 11 versiones principales de OS X. ¿De qué versión estamos hablando exactamente?
Ramhound
10
Para tmux> = 2.1, vea la respuesta de @ DannyRe (actualmente bastante abajo).
joelostblom
3
set -g mouse onfuncionó para mí en macOS tmux 2.1
Miguel Mota
123

Hay algunos cambios para Tmux 2.1

  • El modo del mouse ha sido reescrito. Ahora ya no hay opciones para:

    • mouse-redimensionar-panel
    • mouse-select-pane
    • ventana de selección del mouse
    • ratón de modo

    En cambio, solo hay una opción: 'mouse' que activa completamente el soporte para mouse.

Eso sería

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'"
DannyRe
fuente
66
Gracias, ahora seleccionar paneles, etc. funciona, pero el desplazamiento no lo hace. Para que el desplazamiento funcione de nuevo, use esto: github.com/NHDaly/tmux-scroll-copy-mode
Mahdi
1
impresionante - esto incluso funciona en cygwin - tmux en WINDOWS 7
GWD
@Mahdi Esto parece no funcionar en osx. ¿Alguna pista?
DiTTiD
2
bindya no parece ser necesario en tmux 2.3
Theron Luhn
2
+1 para set -g mouse on. El comentario anterior es correcto. El enlace ya no es necesario.
Dakusan
63

La versión actual de tmux (1.5) le permite simplemente activar la opción de modo-mouse y le permite desplazarse con la rueda del 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.

En mi .tmux.conf:

set-window-option -g mode-mouse on
bukzor
fuente
¡Ese es el comportamiento que realmente quieres! Desplazamiento del mouse que habilita el modo de copia, no solo desplazar el búfer alternativo de shell Ese fue finalmente el incentivo para cambiar de pantalla a tmux para mí. ¿Existe una opción para obtener el mismo comportamiento también con Shift + PgUp?
kynan
1
@kynan: Yo personalmente solo presiono C-A PgUppara hacer eso. Puede enlazar la clave de página directamente con tmux bind-key -n PPage copy-mode -u. El thign similar debería funcionar para shift + pageup si lo desvincula de su terminal local.
bukzor
1
Esto da como resultado un comportamiento extraño en el que, cuando vuelvo a la línea de comando, se inserta un carácter adicional en la CLI, lo que generalmente da como resultado que mi primer comando tenga un formato incorrecto. Es bastante molesto.
Chris R
Tenga en cuenta que, sin embargo, esto funciona bien para activar el desplazamiento con el mouse, provoca un comportamiento extraño al seleccionar el texto para pegarlo con el clic central. Terminé prefiriendo Cb pg-up / down (el valor predeterminado) ya que la compensación no era aceptable.
h7r
@ChrisR También entiendo esto bastante y no es muy consistente. ¿Es un tipo de cadena [M [M # [M [M # [M [M # [M [M # [M]?
Elijah Lynn el
53

Prueba esto en tu .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

Tomado de http://brainscraps.wikia.com/wiki/Extreme_Multitasking_with_tmux_and_PuTTY

John L. Jegutanis
fuente
+1 para escape-timeconfigurar
Dakusan
Para cualquier otra persona que se pregunte, el archivo .tmux.conf se coloca en su directorio de inicio.
user2647513
15

Alguien (de una fuente que perdí) sugirió agregar lo siguiente a ~.tmux.conf:

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

No tengo idea de cómo funciona o qué hace, pero esto ahora me permite desplazarme con la rueda del mouse dentro de una sesión de tmux sin tener que ingresar al modo de copia de tmux; ¡Solo desplazo la rueda y BAM! funciona. Tenga en cuenta que estoy usando terminal.app, pero recuerdo que el OP dio la respuesta específicamente para usar con gnome-terminal.

Jed Daniels
fuente
1
Jed, gracias! Tu consejo también funciona en gnome-terminal. Intentaré usar esta configuración por algún tiempo. Pero tiene una desventaja: el desplazamiento del mouse ahora no funciona como se esperaba less. Si cargo lessdentro tmux, el desplazamiento del mouse no desplaza el archivo abierto less. Se desplaza por toda la terminal. Curiosamente, se vimcomporta como se esperaba dentro tmuxcon su configuración.
user31494
2
Tenga en cuenta que a partir de tmux 1.5 esto es reemplazado por la setw -g mode-mouse onopción, que copia el modo de desplazamiento hacia atrás utilizando la rueda del mouse.
kynan
3
La explicación es que esta opción deshabilita el bloqueo de desplazamiento en la pantalla alternativa del terminal, lo cual es deseable en la mayoría de los casos ya que las aplicaciones que solicitan el búfer de pantalla alternativa (vi, less, tmux, etc.) proporcionan sus propias capacidades de desplazamiento. Anular este bloqueo en tmux permite desplazarse por el búfer de pantalla alternativo del terminal, lo que no da el resultado deseado en todos los casos excepto en algunos. Consulte esta respuesta para obtener una cotización que man xtermexplica la pantalla alternativa.
kynan
Por desgracia, esto no funciona en iTerm
Suan
He tenido resultados positivos con esto en iTerm 2
Keith Smiley
5

tmux 2.1 presenta nuevos enlaces de mouse.

Hoy escribí estos enlaces hoy. Se une sin problemas la rueda del mouse a las flechas cuando no está en Vim, porque Vim es capaz de interpretar los códigos de la rueda del mouse sin procesar (para propósitos tales como elegir qué ventana de Vim se desplazará por usted dependiendo de cuál sea el mouse).

Esto significa que finalmente podemos usar el mouse solo para ver varias páginas de manual y cualquier otra cosa que acepte teclas de flecha. Puede extender y encadenar la iflógica según sea necesario para implementar más lógica para sus aplicaciones.

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"

Con esta nueva capacidad de unión de la rueda, es posible escribir la rueda del mouse para realizar cualquier comportamiento sensible al contexto que desee.

Steven Lu
fuente
Ahora estoy jugando con la idea de hacer que la rueda del mouse en el borde del panel haga algo interesante. Probablemente lo que haré no sea mapear la rueda en el borde, sino mapearla para alternar las ventanas tmux cuando se haga sobre la línea de estado.
Steven Lu
¿Cuál es el enlace a tu Github? ¡Me gustaría estar al tanto de sus esfuerzos! Otra característica que estoy buscando es hacer doble clic para copiar la palabra en el portapapeles X, como lo hace fuera de Tmux.
joeytwiddle
@joeytwiddle Recomiendo github.com/NHDaly/tmux-better-mouse-mode , mira mi otra respuesta
Steven Lu
3

Gnome-terminal realiza algunos trucos geniales al traducir los eventos de desplazamiento del mouse a las teclas de flecha arriba y abajo en condiciones de desplazamiento "habitual" restringido. Por ejemplo, cuando ve un poco de texto usando less(esto ocurre especialmente cuando estás leyendo un hombre), puede desplazarse usando el contenido j, ky las teclas de flecha. Pero también , con gnome-terminal, puedes hacerlo con el desplazamiento del mouse, gracias al truco mencionado.

Así que supongo tmuxque algo de "captura" de la terminal es igual less, y el mismo mecanismo en las gnome-terminalpatadas: el desplazamiento del mouse se traduce en presionar las teclas de flecha arriba / abajo.

Puede desactivar esta función en la configuración del perfil y obtener el desplazamiento regular en cualquier circunstancia. Sólo desmarcar la última casilla de verificación en la pestaña "desplazamiento": la casilla de verificación.

ulidtko
fuente
Gracias por la explicación, uldtko! Pero no ayuda con el problema de desplazamiento del mouse. Sí, con la opción desactivada, gnome-terminaldeja de enviar el triple ^[[Ay se ^[[Bdesplaza con el mouse. Es más agradable tmux(no es feo ^[[A^[[A^[[Aen algunos programas, no es feo el desplazamiento del historial de comandos), pero ahora lessdeja de desplazarse en el desplazamiento del mouse.
usuario31494
1
Ucraniano? (adivinando por los ipersonajes)
dotancohen
1

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

Implementación de control de mouse configurable y con muchas funciones para tmuxes más nuevos. muy recomendable.

Probablemente quieras usar

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

con eso también.

Steven Lu
fuente
Instalé esto pero ya no puedo resaltar y copiar texto con el mouse. ¿Eres capaz de hacer esto?
Jonathan
Sí, es probable que tenga otra configuración tmux relacionada con el mouse presente que entre en conflicto con ella.
Steven Lu
0

Puede combinar las ideas vinculantes de las otras respuestas para obtener un comportamiento de desplazamiento bastante satisfactorio: funciona en los cambios vim al modo de copia automáticamente en la terminal y sale cuando llega al final, aún le permite usar la rueda del mouse en man, less y journalctl.

Mi código:

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

puede agregar otros comandos que requieren teclas de flecha para desplazarse en la parte grep -e 'man'

Agregué las teclas de envío varias veces, por lo que una marca en la rueda del mouse se desplazará 4 líneas a la vez

stealz
fuente
0

Si ya está en una sesión tmux, puede ejecutar el comando

set mouse on

Recordatorio: para ejecutar comandos, use su prefijo entonces :.

Robert
fuente