592 votes

Comment réorganiser les fenêtres tmux?

Dans screen, je peux simplement taper C-a :number 0 pour déplacer une fenêtre en haut de la liste des fenêtres et pousser toutes les autres fenêtres vers le bas. Quelle est la séquence de commandes équivalente pour tmux? J'ai regardé la page de manuel, mais je trouve cela confus sur ce point.

149 votes

C-b, . vous permet de renuméroter une fenêtre.

9 votes

En lisant toutes les nombreuses réponses, je ne vois toujours pas de solution facile à la question de l'OP: comment déplacer une fenêtre donnée à la position 0 et décaler toutes les autres vers la droite. Dois-je vraiment déplacer manuellement chacune d'entre elles pour faire cela? Je veux juste annuler un déplacement que j'ai fait par erreur (et je ne suis pas sûr de quoi exactement) qui je pense a déplacé la fenêtre 0 vers la fenêtre 8 et déplacé toutes les autres vers la gauche.

1 votes

@nealmcb la solution la plus simple que j'ai pu trouver est de régler l'index de base à 1, renuméroter, puis déplacer votre fenêtre dans l'emplacement vide 0 : superuser.com/a/1155999/674549

6voto

gitaarik Points 530

Pour un changement de fenêtre sain et facile:

# Liez P et N (majuscules) pour déplacer la fenêtre actuelle.
bind-key N swap-window -t +1 \; next-window
bind-key P swap-window -t -1 \; previous-window

Avec \; vous pouvez combiner deux commandes en une seule combinaison de touches. Ainsi, nous échangeons d'abord la fenêtre, puis nous déplaçons le focus sur cette fenêtre (originale).

Donc, lorsque vous faites préfixe -> Shift + N, cela déplace la fenêtre actuelle vers l'avant et garde le focus sur cette fenêtre.

Cela me laisse perplexe pourquoi il n'y a pas de commande directe pour cela dans tmux. Pourquoi voudriez-vous quelque chose de plus compliqué? Quoi qu'il en soit, cela corrige cela.

5voto

Flowchartsman Points 213

L'approche que j'utilise combine un peu de la réponse d'Ashish avec celle de piec ; j'ai alt-flèche gauche et droite liées à un petit appel shell rapide qui déplace la fenêtre d'un côté ou de l'autre, sauf s'il s'agit de la première ou de la dernière fenêtre, respectivement. J'ai fait cela parce que, lorsque vous émettez un swap +1 à la dernière fenêtre (ou swap -1 à la première fenêtre), il va quand même échanger, au lieu de revenir en arrière comme vous pourriez vous y attendre :

0:un 1:deux 2:trois 3:zéro*

Devient

0:zéro* 1:deux 2:trois 3:un

Au lieu de

0:zéro* 1:un 2:deux 3:trois

Ainsi, les commandes que j'utilise cessent de fonctionner lorsque la fenêtre a atteint le bord de la liste :

bind-key -n M-Gauche run-shell 'tmux list-windows | head -n 1 | grep -q active || tmux swap-window -d -t -1'
bind-key -n M-Droite run-shell 'tmux list-windows | tail -n 1 | grep -q active || tmux swap-window -d -t +1'

Ceci peut facilement être combiné avec base-index et renumber-windows pour avoir une liste de fenêtres qui commencent à un nombre arbitraire et n'a jamais de lacunes.

Si vous utilisez base-index 1 comme moi et que vous ne pensez pas dépasser 999 fenêtres, vous pouvez utiliser un petit truc pour faire en sorte qu'il se déroule correctement, bien que les commandes deviennent un peu plus imposantes :

set -g base-index 1
set -g renumber-windows on
bind-key -n M-Gauche run-shell 'if tmux list-windows | head -n 1 | grep -q active ; then tmux move-window -t 999 \; move-window -r \; refresh-client -S ; else tmux swap-window -d -t -1 ; fi'
bind-key -n M-Droite run-shell 'if tmux list-windows | tail -n 1 | grep -q active ; then tmux move-window -t 0 \; move-window -r \; refresh-client -S ; else tmux swap-window -d -t +1 ; fi'

Cela fonctionne en déplaçant temporairement la dernière fenêtre vers l'index-0 inutilisé, puis en appelant move-window -r pour les renuméroter en commençant à 1 de nouveau. Cela fonctionne de manière similaire lors du déplacement de la première fenêtre vers la fin ; en choisissant un nombre énorme que vous n'utiliserez jamais, cela garantit que lorsque move-window -r se déclenche à nouveau, tout sera numéroté comme vous vous y attendez. Si vous vous demandez à propos de refresh-client -S, c'est nécessaire car parfois, bien que le réarrangement de move-window fonctionnera correctement, la barre d'état ne se mettra pas à jour tant que d'autres modifications ne seront pas apportées. En forçant un rafraîchissement uniquement de la barre d'état (-S), vous évitez cela.

Le seul problème que je trouve avec cette approche est que swap-window modifiera implicitement la dernière fenêtre utilisée pour celle avec laquelle vous avez échangé. Ainsi, si vous êtes sur la fenêtre n°1, passez à la fenêtre quatre et la déplacez en arrière d'une, vous constaterez que votre dernière fenêtre utilisée est la nouvelle n° 4 (anciennement n°3) au lieu de la n°1. Il ne semble pas y avoir de solution à cela.

MODIFICATION en 2020 : Les versions récentes de tmux nécessitent -d pour maintenir l'ancien comportement de déplacer la fenêtre actuelle et de rester avec elle à sa nouvelle position.

0 votes

Cela fonctionne très bien, j'avais un script externe qui réalise la même chose en 20 lignes de code, vos appels bind-key sont beaucoup plus simples et plus efficaces. Juste une note pour 2020 - les versions actuelles de tmux ne sélectionnent pas automatiquement la fenêtre échangée, donc après swap-window -t -1; j'ai dû ajouter tmux previous-window; et après swap-window -t +1; j'ai dû ajouter tmux next-window;

0 votes

Merci pour la mise à jour, mais cette solution boucle lorsque les fenêtres atteignent le bord. Il vaut mieux utiliser swap-window -d pour retrouver l'ancien comportement. Je vais mettre à jour ma réponse.

3voto

eMBee Points 141

Vous pouvez utiliser base-index pour changer le numéro de départ pour vos fenêtres. si vous définissez base-index à 1, alors move-window -r renumérotera toutes les fenêtres à partir de 1, libérant ainsi 0 pour déplacer une fenêtre dans son emplacement :

définir base-index 1
move-window -r
move-window -t 0

une fois terminé, vous pourriez réinitialiser base-index à 0 si vous voulez utiliser move-window -r plus tard sans déplacer votre fenêtre en 0

2voto

qeatzy Points 286

Les deux swap-window -s 5 et swap-window -t 5 échangent la fenêtre actuelle avec la fenêtre 5, mais avec des sémantiques différentes.

swap-window -s 5

  • le programme de la fenêtre 5 est en cours avec le numéro de fenêtre actuel.
  • le numéro de fenêtre récente reste inchangé.
  • répéter la même commande reviendra à l'état précédent.

swap-window -t 5

  • le programme actuel est en cours avec le numéro 5.
  • remplacement récent par le numéro de fenêtre actuelle.

le nombre dans swap-window -s number et -t number peut être à la fois absolu, par exemple, 5, et relatif, par exemple, -1, +2.

P.S. ci-dessous un extrait de la barre d'état de tmux illustrant l'effet de swap-window -s 5

récent:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

maintenant, après last-window:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

après swapw -s 5:
[0] 0:mc* 1:mpl 2:py2- 3:numpy 4:plot 5:vim

un autre swapw -s 5:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

un autre last-window:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

0 votes

Voir cette réponse pour une fonction bash permettant de décaler la plage des fenêtres tmux, par exemple, [2-5] de [0-6] fenêtres.

2voto

Hamdi Al-Haj Points 21

À partir de la fenêtre tmux, essayez ce qui suit pour échanger la fenêtre 0 avec la 1 :

$ tmux swap-window -d -s 0 -t 1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X