¿Cómo paso por los paneles dentro de una ventana en tmux como en la pantalla?

41

Pensé que mover el panel tmux a la ventana era la misma pregunta, pero no parece serlo.

Al usar la pantalla GNU regularmente, estoy buscando que tmux haga lo mismo. Una de las cosas que hago regularmente es tener un par de ventanas diferentes abiertas, una con algún código abierto en vim, y un par de ventanas de terminales abiertas para probar el código, y a veces una o dos ventanas para varias otras cosas. Dividí la pantalla verticalmente y, a menudo, tendré la ventana vim en el panel superior y luego una de las otras ventanas en la barra inferior.

Los comandos principales que luego uso son Ctrla, Tabrotar entre los paneles y Ctrla, nrotar entre las ventanas dentro de un panel. Por ejemplo, con vim en el panel superior, cambio al panel inferior y luego giro a través de los otros terminales, haciendo lo que sea necesario. La pantalla permanece dividida todo el tiempo.

El problema es que no puedo encontrar una capacidad comparable a la de la pantalla Ctrla, nen tmux. Cambiar ventanas parece no funcionar dentro de un panel, pero salta por completo. Si la pantalla se divide, las dos únicas opciones parecen ser saltar a una ventana que no está dividida y luego dividirla o hacer una subdivisión de un panel. Tampoco es lo que estaba buscando.

¿Sugerencias (además de quedarse con la pantalla)?

FooBar
fuente
Tu terminología es un poco confusa. En tmuxuna ventana se puede dividir en múltiples paneles. ¿Estás intentando alternar entre paneles en una ventana con una combinación de teclas?
jasonwryan
Estaba tratando de seguir la nomenclatura de las herramientas, pero admito que es confuso. Sé cómo cambiar el foco de un panel a otro. Lo que estoy tratando de averiguar es cómo alternar lo que se muestra en un panel en particular sin cambiar el diseño.
FooBar
Entonces, ¿para mover contenido de un panel a otro? ¿Está buscando swap-pane? Si está buscando emular la pantalla Ctrl-a n, entonces el equivalente de tmux es Ctrl-b n.
jasonwryan

Respuestas:

28

tmux y screen tienen diferentes modelos, por lo que no hay un equivalente exacto.

En términos de pantalla , una división le permite mostrar múltiples ventanas al mismo tiempo. next( C-a n) gira las ventanas a través de la parte activa de la división; esto le permite rotar ventanas "ocultas" a través de la región activa de la división.

En términos de tmux , una división divide una ventana en uno o más paneles. Cada parte de una ventana dividida es un panel individual, los paneles nunca están ocultos (si se selecciona una ventana (visible), todos sus paneles también lo están), y un panel solo se puede usar en una sola división de una ventana (un panel puede no estar en múltiples ventanas, y no puede estar en múltiples divisiones de la misma ventana). Hay comandos para mover paneles en (o entre) ventanas, pero no de la misma manera que nexten la pantalla .


Puede usar un enlace como el siguiente para organizar un efecto similar:

bind-key C-n swap-pane -s :+.top \; rotate-window -Ut :+

Probablemente desee poner esto en su ~/.tmux.confarchivo, pero puede simplemente escribirlo / pegarlo luego Prefix :para vincularlo en su instancia de servidor actual.

Para usar el enlace, elija su "ventana principal", divídala, cree una ventana de "contenedor de paneles" inmediatamente después de la "ventana principal", luego use el enlace para rotar cualquier panel en la "ventana principal" entre el grupo en el " ventana de contenedor de panel ".

Así es como puede crear la configuración:

  • Elija una ventana para usar como su "ventana principal". Inicio (por ejemplo) Vim en él.

  • Divide tu "ventana principal" en dos paneles.

    Por ejemplo Prefix "( :split-window)

    Puede usar este panel como su ventana de prueba (o visor de registros, o lo que sea).

  • Cree una nueva ventana (el "contenedor de panel") inmediatamente después de su ventana principal.

    Por ejemplo Prefix c( :new-window)

    Es importante que ninguna otra ventana se interponga entre los índices de la "ventana principal" y la ventana del "contenedor de panel" ( +en los especificadores de ventana utilizados en los comandos enlazados significa "la siguiente ventana con el número más alto").

  • Divide esta ventana en varios paneles. Para rotar a través de tres paneles, divida esta ventana en dos paneles (el tercer panel es el de la "ventana principal").

    Tal vez necesite un shell para git y un shell para ejecutar una interfaz de base de datos. Coloque cada uno en un panel separado en esta ventana de "contenedor de paneles".

  • Vuelva a su "ventana principal". Seleccione el panel que desea "rotar".

    Puede usar Prefix Up/ Down/ Left/ Rightpara moverse entre los paneles.

  • Invoque el enlace para intercambiar el panel actual con el primer panel en la ventana "contenedor de panel" y ("detrás de escena") gire los paneles dentro de la ventana "contenedor de panel" (de modo que la próxima vez que ejecute el enlace, el primer comando intercambia con el panel "siguiente" en la secuencia).

    Prefix Control- n(el enlace usa Cn, pero puedes cambiar esto a lo que quieras).

  • Para desplazarse hacia atrás por los paneles, puede usar lo siguiente:

Bind-key Cp swap-pane -s: +. bottom \; rotate-window -Dt: +
Chris Johnsen
fuente
¡Gracias! Gran explicación y su enlace sugerido parece al menos replicar la funcionalidad que estaba buscando.
FooBar
Disculpe, ¿cómo podría un tamaño completo de un panel y luego volver al arreglo anterior?
MageProspero
1
@JamesAndino: tmux 1.8 tiene resize-pane -Z(por defecto, vinculado a Prefijo + z) que temporalmente "amplía" un panel para que tenga el tamaño completo de la ventana. Para la versión anterior a la 1.8 no había una forma integrada de hacerlo; otros han creado soluciones con secuencias de comandos a partir de otros comandos integrados (por ejemplo, algunas de las respuestas a la pregunta SU "Maximizar" un panel en tmux ).
Chris Johnsen
ty, compilado y cargado
MageProspero
3
Creo que los C-b opaneles de ciclos.
Sam Selikoff
39

Creo que lo que busca es Ctrlb+ ( , , , ). Esos te permitirán moverte entre los paneles.

sparticvs
fuente
2
Lo siento, pero no estaba muy claro. He descubierto cómo pasar de un panel a otro. En tmux, Ctrl b + o funciona casi igual que Ctrl a + Tab en la pantalla. Lo que estoy buscando es la funcionalidad equivalente a la pantalla Ctrl a + n.
FooBar
@FooBar ¿qué tal Ctrl-b+{o Ctrl-b+}? Eso es lo más cerca que puedo encontrar de esa funcionalidad. Los paneles no se hacen de la misma manera en tmux que en la pantalla.
sparticvs
A menudo tengo problemas para enfocar el panel resaltado, digamos que tengo dos paneles, a menudo presiono ^b↑. ¿Cómo puedo enfocar el panel resaltado para que otro sea ​​capturado por el shell, no tmux?
ThorSummoner
6

use bind -r, para que pueda presionar prefixuna vez, luego otras teclas en una secuencia para ubicar su panel. El tiempo de espera puede ser ajustado por repeat-time. Comprobarman tmux

bind -r Tab select-pane -t :.+

Si lo prefiere hjkl,

bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
zhazha
fuente
2

Aquí hay una pequeña configuración que le permite moverse a otros paneles o ventanas utilizando los atajos ALT o MAYÚS + flecha. No es necesario usar el prefijo de tecla es cómodo.

## NAVIGATION: ############################

# Switch panes 
# Usage: "ALT+arrow keys" (without prefix key)
# from https://gist.github.com/spicycode
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Switch windows 
# usage: "SHIFT+arrow" (without prefix key)
bind -n S-Left  previous-window
bind -n S-Right next-window

Si eres más vago que yo, también te podría interesar el siguiente código que permite la navegación de paneles con el mouse. (uso: prefijo de tecla + m para encender, M para apagarlo)

## MOUSE CONTROL: #########################
set -g mode-mouse off
set -g mouse-resize-pane off
set -g mouse-select-pane off
set -g mouse-select-window off

# Toggle mouse on 
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'

# Toggle mouse off
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

esta configuración debería funcionar está funcionando seguro para tmux 1.6 a 1.9.

xaa
fuente
2

Esta respuesta le ofrece dos paneles, donde ambos paneles tienen el mismo conjunto de ventanas, pero cada panel puede cambiar entre ventanas de forma independiente.

El enfoque de tmux es usar tres sesiones:

  • una sesión externa para los paneles ,
  • una sesión interna para las ventanas (puede adjuntar a esto desde un panel),
  • una vista secundaria en la sesión interna (para el otro panel).

Sí, esta es la filosofía de UNIX enloquecida. Empecemos:

# Create a session to hold the multiple windows
$ tmux new-session -s inner

    <Ctrl-b> c   to create a few windows, run some things

    <Ctrl-b> d   to detach, but leave it running

# Create a session to hold multiple panes (the view)
$ tmux new-session -s outer

    <Ctrl-b> "   to split

# Open the inner session in the current (bottom) pane
$ unset TMUX ; tmux attach -t inner

Ahora puede cambiar al panel superior y abrir Vim como de costumbre. Para recorrer las ventanas de la sesión interna (el panel inferior), deberá usar Ctrl-b Ctrl-b ny p.

Aparte: Eso es un poco difícil de manejar, pero siempre puedes cambiar el prefijo de la sesión externa, por ejemplo Ctrl-a, a:

<Ctrl-b> :set-option prefix C-a

Entonces sería Ctrl-b ny cambiar plas ventanas internas y Ctrl-a olos paneles externos.

Bien ahora, en lugar de abrir Vim en el panel superior, conectemos nuevamente a su sesión interna. Salga de vim, y esta vez use un new-sessioncomando (especialmente con -tnot -s):

$ tmux new-session -t inner

Voila! Ahora puede recorrer las ventanas en los paneles superior e inferior.

La razón por la que debemos usar new-session -tla segunda vez es que si simplemente volviéramos attach -ta hacerlo , los paneles superior e inferior se sincronizarían, mostrando siempre la misma ventana, que no es lo que desea. Para permitir que este panel se mueva a través de las ventanas independientemente del otro panel, creamos una nueva sesión de "vista" pero conectamos su back-end directamente a la sesión existente que contiene las ventanas. Esto también se conoce como " sesiones agrupadas ". (Por cierto, ese enlace también sugiere usar [un]link-windowpara mover ventanas entre sesiones).

Por supuesto, para la simetría, también podría haber corrido tmux new-session -t inneren el panel inferior, en lugar de hacerlo attach. ¡En ese caso, estaría ejecutando 4 instancias de tmux (más un proceso tmux más para el servidor)!

joeytwiddle
fuente
0

Pon el siguiente código en tu .tmux.conf:

# cycle prev/next pane
bind -n S-right select-pane -t :.+
bind -n S-left select-pane -t :.-

Vuelva a cargar la configuración, luego puede presionar (directamente sin la tecla de prefijo) Shift+ para alternar los paneles en el sentido de las agujas del reloj y Shift+ para alternar en el sentido inverso.

Probado en Tmux 2.8.


En caso de que no desee editar la configuración, prefix+ oes el enlace de tecla predeterminado para el ciclo en el sentido de las agujas del reloj. En ocasiones encontré este enlace de teclas, luego obtengo el comando tmux list-keysy lo uso para mis propios enlaces de teclas:

bind-key    -T prefix       o                 select-pane -t :.+
Reorx
fuente