Comment parcourir les volets d'une fenêtre dans tmux comme dans un écran?

41

Je pensais que Déplacer le volet tmux vers la fenêtre était la même question, mais cela ne semble pas être le cas.

Venant d’utiliser GNU screen régulièrement, je recherche tmux pour faire la même chose. Parmi les choses que je fais régulièrement, il y a plusieurs fenêtres ouvertes, une avec un code ouvert dans vim, et deux fenêtres de terminaux ouvertes pour tester le code, et parfois une fenêtre ou deux pour diverses autres choses. Je divise l'écran verticalement et la fenêtre vim apparaît souvent dans le volet supérieur, puis l'une des autres fenêtres dans le volet inférieur.

Les principales commandes I puis l' utilisation figurent Ctrla, Tabpour faire pivoter entre les vitres et Ctrla, npour une rotation entre les fenêtres à l' intérieur d' une vitre. Par exemple, avec vim dans le volet supérieur, je bascule vers le volet inférieur, puis je fais pivoter les autres terminaux, en faisant tout ce dont j'ai besoin. L'écran reste divisé tout le temps.

Le problème est que je ne trouve pas de capacité comparable à celle de screen Ctrla, ndans tmux. Changer de fenêtre ne semble pas fonctionner dans un volet, mais saute complètement. Si l'écran est divisé, les deux seules options semblent être de passer à une fenêtre qui n'est pas divisée, puis de la scinder ou de créer une sous-division d'un volet. Ni ce que je cherchais.

Suggestions (en plus de coller avec l'écran)?

FooBar
la source
Votre terminologie est un peu déroutante. Dans tmuxune fenêtre peut être divisé en plusieurs volets. Essayez-vous de parcourir les volets d'une fenêtre avec un raccourci clavier?
jasonwryan
J'essayais de suivre la nomenclature des outils, mais j'avoue que c'est déroutant. Je sais comment changer le focus d'un volet à un autre. Ce que j'essaie de savoir, c'est comment passer en revue ce qui est affiché dans un volet particulier sans modifier autrement la disposition.
FooBar
Donc, pour déplacer le contenu d'un volet à un autre? Cherchez-vous swap-pane? Si vous cherchez à émuler des écrans Ctrl-a n, l'équivalent de tmux est alors Ctrl-b n.
jasonwryan

Réponses:

28

tmux et screen ont des modèles différents, il n’existe donc pas d’équivalent exact.

En termes d' écran , un fractionnement vous permet d'afficher plusieurs fenêtres en même temps. next( C-a n) fait pivoter les fenêtres à travers la partie active de la scission; Cela vous permet de faire pivoter les fenêtres «cachées» dans la région active de la scission.

En termes de tmux , une scission divise une fenêtre en un ou plusieurs volets. Chaque partie d’une fenêtre divisée est un volet individuel, les volets ne sont jamais masqués (si une fenêtre est sélectionnée (visible), tous ses volets le sont également), et un volet ne peut être utilisé que dans une seule division de la fenêtre (un volet peut être utilisé). ne pas être dans plusieurs fenêtres, et il ne peut pas être dans plusieurs divisions de la même fenêtre). Il existe des commandes permettant de déplacer les volets dans (ou entre) des fenêtres, mais pas de la même manière que nextdans l' écran .


Vous pouvez utiliser une liaison comme celle-ci pour obtenir un effet similaire:

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

Vous voudrez probablement le mettre dans votre ~/.tmux.conffichier, mais vous pouvez simplement le saisir / le coller après Prefix :pour le lier à votre instance de serveur actuelle.

Pour utiliser la liaison, choisissez votre «fenêtre principale», divisez-la, créez une fenêtre «Conteneur de volet» immédiatement après la «fenêtre principale», puis utilisez la liaison pour faire pivoter n’importe quel volet de la «fenêtre principale» dans le groupe « conteneur "fenêtre".

Voici comment vous pouvez créer la configuration:

  • Choisissez une fenêtre à utiliser comme «fenêtre principale». Commencez (par exemple) Vim dedans.

  • Divisez votre "fenêtre principale" en deux volets.

    Exemples : Prefix "( :split-window)

    Vous pouvez utiliser ce volet comme fenêtre de test (ou visionneuse de journal, ou autre).

  • Créez une nouvelle fenêtre (le «conteneur de volet») immédiatement après votre fenêtre principale.

    Exemples : Prefix c( :new-window)

    Il est important qu'aucune autre fenêtre ne se place entre les index de la "fenêtre principale" et de la fenêtre "Conteneur de volet" ( +les spécificateurs de fenêtre utilisés dans les commandes liées signifient "la fenêtre suivante numérotée plus haut").

  • Divisez cette fenêtre en un certain nombre de volets. Pour faire une rotation dans trois volets, divisez cette fenêtre en deux (le troisième volet est celui de la «fenêtre principale»).

    Peut-être avez-vous besoin d'un shell pour git et d'un shell pour l'exécution d'une interface de base de données. Placez chacun dans un volet séparé de cette fenêtre «Conteneur de volet».

  • Revenez à votre "fenêtre principale". Sélectionnez le volet que vous souhaitez «faire pivoter».

    Vous pouvez utiliser Prefix Up/ Down/ Left/ Rightpour vous déplacer parmi les volets.

  • Appelez la liaison pour permuter le volet actuel avec le premier volet de la fenêtre «Conteneur de volet» et («en coulisse») faire pivoter les volets à l'intérieur de la fenêtre «Conteneur de volet» (pour que la première commande soit exécutée la prochaine fois. bascule avec le volet «suivant» de la séquence).

    Prefix Control- n(la liaison utilise Cn, mais vous pouvez changer cela en ce que vous voulez).

  • Pour faire défiler les volets vers l’arrière, vous pouvez utiliser ce qui suit:

bind-key Cp panneau de swap -s: +. bottom \; rotation-fenêtre -Dt: +
Chris Johnsen
la source
Merci! Excellente explication et votre liaison suggérée semble au moins reproduire la fonctionnalité que je cherchais.
FooBar
Excusez-moi, comment peut-on faire un carreau en taille réelle puis revenir à l'arrangement précédent
MageProspero
1
@JamesAndino: tmux 1.8 a resize-pane -Z(par défaut, lié à Prefix + z) qui "agrandit" temporairement un volet pour qu'il soit à la taille de la fenêtre. Pour les versions antérieures à 1.8, il n'y avait pas de moyen intégré de le faire; d'autres ont conçu des solutions scriptées à partir d'autres commandes intégrées (par exemple, certaines des réponses à la question du SU «Maximiser» un volet dans tmux ).
Chris Johnsen
ty, compilé et chargé
MageProspero
3
Je crois que les C-b ocycles vitres.
Sam Selikoff
39

Je crois que ce que vous recherchez est Ctrlb+ ( , , , ). Ceux-ci vous permettront de vous déplacer entre les panneaux.

sparticvs
la source
2
Je suis désolé, mais je n'ai pas été très clair. J'ai trouvé comment passer d'un panneau à l'autre. Dans tmux, Ctrl b + o fonctionne à peu près de la même manière que Ctrl a + Tab dans l’écran. Ce que je recherche, c’est la fonctionnalité équivalente à Ctrl a + n de l’écran.
FooBar
@FooBar que diriez-vous Ctrl-b+{ou Ctrl-b+}? C'est à peu près aussi proche que possible de cette fonctionnalité. Les volets ne sont pas réalisés de la même manière dans tmux car ils sont gérés à l'écran.
Avis du
J'ai souvent du mal à mettre le volet en surbrillance en place. Par exemple, je presse souvent ^b↑. Comment puis-je alors focaliser le volet en surbrillance de manière à ce qu'un autre soit capturé par le shell, pas par tmux?
ThorSummoner
6

utilisez bind -rpour pouvoir appuyer prefixune fois sur la touche , puis sur les autres touches de la séquence pour localiser votre volet. Le délai d'attente pourrait être ajusté par repeat-time. Vérifierman tmux

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

Si vous préférez 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
la source
2

Voici une petite conf qui vous permet de vous déplacer dans une autre fenêtre en utilisant les raccourcis clavier ALT ou SHIFT + flèche. Pas besoin d'utiliser le préfixe de clé, c'est confortable.

## 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 vous êtes plus paresseux que moi, vous pourriez également être intéressé par le code suivant qui permet la navigation entre les volets à la souris. (utilisation: préfixe clé + m pour l'allumer, M pour l'éteindre)

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

cette configuration devrait fonctionner pour tmux 1.6 à 1.9.

xaa
la source
2

Cette réponse vous donne deux panneaux, où les deux panneaux contiennent le même ensemble de fenêtres, mais chaque panneau peut basculer indépendamment d'une fenêtre à l'autre.

L’approche tmux consiste à utiliser trois sessions:

  • une session externe pour les vitres ,
  • une session interne pour les fenêtres (vous pouvez y attacher depuis un volet),
  • une vue secondaire sur la session interne (pour l'autre volet).

Oui, c’est la philosophie UNIX devenue folle. Commençons:

# 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

Vous pouvez maintenant passer au volet supérieur et ouvrir Vim comme d’habitude. Pour parcourir les fenêtres de la session interne (le volet inférieur), vous devez utiliser Ctrl-b Ctrl-b net p.

A part: c'est un peu lourd, mais vous pouvez toujours changer le préfixe de la session externe, par exemple Ctrl-a, comme suit:

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

Ensuite , il serait juste Ctrl-b net ppour faire défiler les fenêtres intérieures, et Ctrl-a opour faire défiler les vitres extérieures.

OK maintenant, au lieu d'ouvrir Vim dans le volet supérieur, connectons-nous à nouveau à votre session interne. Quittez vim et utilisez cette fois une new-sessioncommande (avec -tnot not not -s):

$ tmux new-session -t inner

Voila! Vous pouvez maintenant parcourir les fenêtres des panneaux supérieur et inférieur.

La raison pour laquelle nous devons utiliser new-session -tla deuxième fois est que si nous répétions simplement l'opération attach -t, les volets supérieur et inférieur seraient synchronisés, affichant toujours la même fenêtre, ce qui n'est pas ce que vous voulez. Pour laisser ce volet se déplacer d’une fenêtre à l’autre indépendamment de l’autre volet, nous créons une nouvelle session "vue" mais connectons son back-end directement à la session existante qui contient les fenêtres. Ceci est également appelé " sessions groupées ". (D'ailleurs, ce lien suggère également d'utiliser [un]link-windowpour déplacer des fenêtres entre les sessions.)

Bien sûr, pour des raisons de symétrie, vous auriez également pu exécuter tmux new-session -t innerle volet inférieur au lieu de attach. Dans ce cas, vous exécuteriez 4 instances de tmux (plus un processus tmux supplémentaire pour le serveur)!

Joeytwiddle
la source
0

Mettez le code suivant dans votre .tmux.conf:

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

Reload config, puis vous pouvez appuyer (directement sans touche de préfixe) Shift+ pour faire défiler les volets dans le sens des aiguilles d’une montre, et Shift+ pour faire défiler en sens inverse.

Testé dans Tmux 2.8.


Si vous ne souhaitez pas modifier la configuration, prefix+ oest la liaison de clé par défaut pour un cycle dans le sens des aiguilles d'une montre. J'ai parfois trouvé cette liaison de clé, puis je récupère la commande tmux list-keyset l'utilise pour mes propres liaisons de clé:

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