2011-02-02 19:53:22 +0000 2011-02-02 19:53:22 +0000
436
436

Comment réorganiser les fenêtres tmux ?

Dans screen, je peux juste 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 commande équivalente pour tmux ? J'ai regardé la page de manuel, mais je trouve que c'est déroutant sur ce point.

Réponses (19)

491
491
491
2011-03-01 09:39:45 +0000

La commande swap-window est la plus proche de ce que vous voulez.

“Prefix :” (c'est-à-dire Ctrl+B, : par défaut) vous amène à l'invite de commande tmux-command. C'est là que vous entrez :

swap-window -s 3 -t 1

pour permettre à la fenêtre numéro 3 et à la fenêtre numéro 1 d'échanger leurs positions.

Pour échanger la fenêtre actuelle avec la fenêtre du haut, faites :

swap-window -t 0

Dans le cas peu probable où il n'y aurait pas de fenêtre à l'indice 0, faites :

move-window -t 0

(si l'indice de base est 0, comme c'est le cas par défaut).

Vous pouvez lier cette commande à une touche (T pour “top” par exemple) en ajoutant ce qui suit à votre ~/.tmux.conf :

bind-key T swap-window -t 0
279
279
279
2013-02-15 11:18:09 +0000

Pour compléter la réponse de Gareth, vous pouvez utiliser les raccourcis clavier suivants

bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1

En appuyant sur Ctrl+Maj+Gauche (la fenêtre actuelle sera déplacée vers la gauche. De même à droite. Il n'est pas nécessaire d'utiliser le modificateur (C-b).

Pour la version tmux 3.0, vous devez utiliser les raccourcis clavier suivants

bind-key -n C-S-Left swap-window -t -1\; select-window -t -1
bind-key -n C-S-Right swap-window -t +1\; select-window -t +1
67
67
67
2011-04-05 22:12:22 +0000

Le tmux équivalent à :number 42 est :move-window -t 42.

17
17
17
2013-07-09 22:16:07 +0000

Je renumérote les fenêtres de cette façon :

Ctrl+b, ., 222

rendrait la fenêtre tmux actuelle (tous les volets) numéro 222.


connexe : Quand je mélange les choses, j'ai tendance à vouloir faire

Ctrl+b :new-session -d -s "reading"

et de là, je peux aussi utiliser Ctrl+b, ., reading pour déplacer la fenêtre actuelle (tous les volets à la fois) vers la session de lecture. Vous pouvez naviguer entre les sessions avec Ctrl+b, s comme vous le feriez à l'intérieur d'une session en utilisant Ctrl+b, w.

HTH

12
12
12
2012-04-16 15:42:48 +0000

Vous pouvez implémenter un équivalent de la commande screen de number en utilisant un script shell externe qui choisit entre swap-window et move-window. Vous pouvez le lier à une clé de cette façon :

bind < command-prompt -p index "run-shell '~/.tmux.number.sh %%'"

~/.tmux.number.sh :

#!/bin/bash
if [$# -ne 1 -o -z "$1"]; then
    exit 1
fi
if tmux list-windows | grep -q "^$1:"; then
    tmux swap-window -t $1
else
    tmux move-window -t $1
fi
8
8
8
2011-12-12 03:13:19 +0000

Utilisation de la fenêtre d'échange pour se déplacer vers n'importe quel identifiant :

# window movement / renumbering like in screen's :number
bind-key m command-prompt -p "move window to:" "swap-window -t '%%'"

[m pour déplacer –> appuyez sur le préfixe m et entrez, par exemple, 3 … pour renuméroter la fenêtre en 3]

5
5
5
2016-03-18 17:08:47 +0000

Puisque la réponse d'Ashish Ariga ne fonctionne pas sur la version 1.9a et suivantes. J'utilise < et > pour changer de fenêtre à gauche et à droite, respectivement, en ajoutant la ligne ci-dessous à .tmux.conf.

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
4
4
4
2015-02-09 12:34:24 +0000

La solution la plus simple à partir de man, est d'utiliser les fixations par défaut :

{ Swap the current pane with the previous pane.
} Swap the current pane with the next pane.
3
3
3
2016-01-26 00:48:42 +0000

Pour ceux d'entre vous qui utilisent byobu comme emballage pour leur tmux, vous pouvez échanger la fenêtre actuelle avec la fenêtre précédente ou suivante :

Ctrl-Shift-F3
Ctrl-Shift-F4

La clé de liaison définie par byobu pour ces clés peut être intéressante :

bind-key -n C-S-F3 swap-window -t :-1
bind-key -n C-S-F4 swap-window -t :+1
2
2
2
2016-12-13 06:50:32 +0000

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

set base-index 1
move-window -r
move-window -t 0

lorsque vous avez terminé, vous pouvez remettre base-index à 0 si vous voulez utiliser move-window -r plus tard sans déplacer votre fenêtre à 0.

2
2
2
2016-12-29 18:30:54 +0000

tmux-pain-control fournit ctrl-b > et ctrl-b < pour déplacer la fenêtre focalisée à droite et à gauche, en l'enroulant.

2
2
2
2013-06-24 20:29:13 +0000

L'approche que j'utilise combine un peu de la réponse d'Ashish avec celle de Piec ; j'ai des flèches gauche et droite liées à un petit cri d'obus rapide qui déplace la fenêtre une vers la gauche ou la droite, à moins que ce ne soit la première ou la dernière fenêtre, respectueusement. J'ai fait cela parce que, lorsque vous lancez un swap +1 à la dernière fenêtre (ou un swap -1 à la première fenêtre), il va toujours swap, au lieu de faire une nouvelle boucle comme on pourrait s'y attendre :

0:one 1:two 2:three 3:zero*

Devient

0:zero* 1:two 2:three 3:one

Au lieu de

0:zero* 1:one 2:two 3:three

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

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

Cela peut facilement être combiné avec base-index et renuméroter-fenêtres pour avoir une liste de fenêtres qui commencent à un nombre arbitraire et n'ont jamais de trous.

Si vous utilisez base-index 1 comme moi et que vous pensez ne jamais dépasser 999 fenêtres, vous pouvez utiliser une petite astuce pour le faire fonctionner correctement, bien que les commandes soient un peu gonflées :

set -g base-index 1
set -g renumber-windows on
bind-key -n M-Left 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 -t -1 ; fi'
bind-key -n M-Right 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 -t +1 ; fi'

Cela fonctionne en déplaçant temporairement la dernière fenêtre vers l'index 0 non utilisé et en appelant ensuite move-window -r pour les renuméroter à partir de 1 à nouveau. Cela fonctionne de la même manière lorsque vous déplacez la première fenêtre vers la fin ; en choisissant un nombre énorme que vous n'utiliserez jamais, vous vous assurez que lorsque move-window -r tirera à nouveau, tout sera numéroté comme vous vous y attendez. Si vous vous posez des questions sur le refresh-client -S, c'est nécessaire car parfois, alors que la commande de move-window fonctionne correctement, la barre d'état ne se met pas à jour tant que d'autres changements ne sont pas effectués. En forçant un rafraîchissement de la seule barre d'état (-S), vous évitez cela.

Le seul problème que je peux trouver avec cette approche est que swap-window va implicitement modifier la dernière fenêtre utilisée par rapport à celle avec laquelle vous avez échangé. Ainsi, si vous êtes sur la fenêtre #1, que vous passez à la fenêtre 4 et que vous la déplacez vers l'arrière, vous constaterez que votre dernière fenêtre utilisée est la nouvelle # 4 (anciennement # 3) au lieu de la #1. Il ne semble pas y avoir de moyen de contourner ce problème.

1
1
1
2017-10-07 08:44:19 +0000

Les deux swap-window -s 5 et swap-window -t 5 échangent la fenêtre actuelle avec la fenêtre 5, mais avec une sémantique différente.

swap-window -s 5

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

swap-window -t 5

  • programme actuel en vigueur avec le numéro 5.
  • le numéro de fenêtre actuel est remplacé par le numéro récent.

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

P.S. ci-dessous se trouve un extrait de la ligne d'état 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

1
1
1
2018-07-04 22:36:52 +0000

Depuis la fenêtre tmux, essayez de remplacer la fenêtre 0 par la fenêtre 1 :

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

0
0
0
2016-05-15 14:31:11 +0000

Tout d'abord, ouvrez le communiqué de presse et la commande tmux :

Ctrl + b

Et pour changer la fenêtre actuelle vers la fenêtre de droite (dans un ordre circulaire), il suffit de faire :

}

Pour changer la fenêtre actuelle vers la gauche :

{
  • N'oubliez pas d'utiliser SHIFT lorsque vous appuyez sur } ou {.
0
0
0
2017-09-14 10:58:56 +0000

Pour ce que ça vaut :

J'ai piraté ce script pour pouvoir commander toutes les fenêtres dans un “TUI”. Il liste toutes vos fenêtres dans un fichier temporaire, l'ouvre avec votre éditeur par défaut (en supposant que vous avez défini $EDITOR). Vous pouvez ensuite réorganiser les lignes et, après avoir enregistré et fermé le fichier, les fenêtres sont réorganisées en conséquence. (C'est similaire à l'ordre des commits lorsque vous faites git rebase -i)

#!/bin/bash

# Usage: tmux-mv    
# Move your tmux windows around in an editor

tmpfile=$(mktemp)
tmux list-windows > $tmpfile
$EDITOR $tmpfile

# Move all windows to 50..x in the order you just specified
# Assumes you don't have 50 windows already(!)
cat $tmpfile | awk -F ":" '{ print " -s " $1 " -t 5" NR-1 }' |\
  xargs -I {} sh -c 'tmux move-window -d {}'

# Move them back down, retaining the order
tmux move-window -d -r
rm $tmpfile

Il pourrait probablement être amélioré sur beaucoup de points, en particulier :

NOTE : Vous pourriez être déplacé vers une autre fenêtre après avoir exécuté la commande. Un gif de celle-ci en action (github)

0
0
0
2018-05-22 20:05:43 +0000

Aucune des réponses ne me satisfaisait, alors j'ai écrit un script qui (en quelque sorte) imite le comportement de déplacement des fenêtres screen pour tmux.

Il détecte si le numéro de la fenêtre de destination est plus petit que le plus petit numéro de fenêtre ou plus grand que le plus grand numéro de fenêtre, et si c'est le cas, il pousse toutes les autres fenêtres vers la droite ou la gauche (respectivement) et les renumérote de 1 à N par incréments. Cela se fait avec la commande move-window.

Si le numéro de fenêtre est entre les plus petits/plus grands numéros (c'est-à-dire, vraisemblablement, correspond à un numéro de fenêtre existant), il les échange simplement avec la commande swap-window.

Voici le script :

#!/usr/bin/env bash
# Filename: ~/tmux-windowswap
# Function that provides improved window-swapping functionality for tmux
maxwin="$(tmux list-windows | cut -d: -f1 | sort -nr | head -n1)"
minwin="$(tmux list-windows | cut -d: -f1 | sort -n | head -n1)"
# Error checking
if [[-z $2]]; then
  echo "Error: No window specified."
elif [[! $2 =~ ^-?[0-9]+$ ]]; then
  echo "Error: Bad window number specified."
# Bigger than everything; slide it to the far right, then renumber
elif [[$2 -gt $maxwin]]; then
  i=0 # intialize
  tmux move-window -t:$(($maxwin+1))
  winlist="$(tmux list-windows | cut -d: -f1 | xargs)"
  for n in $winlist; do
    i=$(($i+1)) # increment
    tmux move-window -s:$n -t:$i
  done
# Smaller than everything; slide it to the far left, then renumber
elif [[$2 -lt $minwin]]; then
  tmux move-window -t:0
  winlist=($(tmux list-windows | cut -d: -f1 | xargs | rev))
  i=${#winlist[@]} # initialize; start at highest indexed window
  for n in ${winlist[@]}; do
    tmux move-window -s:$n -t:$i
    i=$(($i-1)) # decrement
  done
# In-between; just a simple swap
else
  tmux swap-window -t:$2
fi

Ensuite, il suffit d'ajouter ce simple raccourci clavier à votre .tmux.conf :

bind m command -p "Send window to:" "run -b '~/tmux-windowswap #I %1'"

Note : Pour imiter parfaitement le comportement d'échange de fenêtres screen, je crois que lorsque vous déplacez une fenêtre vers un numéro de fenêtre existant, elle doit prendre la place de cette fenêtre et toutes les autres fenêtres sont poussées vers la droite. Il serait assez simple de modifier ce script pour ce faire.

0
0
0
2014-10-31 15:53:04 +0000

C'est la méthode que j'utilise. Vous ne pouvez toujours pas déplacer une fenêtre vers un index occupé, mais vous pouvez en déplacer une vers un index plus élevé (inutilisé) et réarranger l'espace où se trouvait l'index précédent.

Disons que vous avez 3 fenêtres et que vous voulez en ajouter une quatrième mais à l'endroit où se trouvait la 3 précédente.

Avant que vous n'ajoutiez une nouvelle fenêtre : Le préfixe Tmux puis . ouvriront la commande de déplacement. Tapez 4 et l'index de 3 deviendra 4, puis ajoutez simplement une autre fenêtre et elle sera à l'index 3 et votre ancienne fenêtre sera toujours à l'index 4.

0
0
0
2019-09-16 23:39:34 +0000

Pas besoin de la ligne de commande (qui est Ctrl + b et ensuite :)

Il suffit de déplacer vos fenêtres avec

Ctrl + b + :

puis d'entrer le numéro de la nouvelle fenêtre (libre) et de frapper Entrée

S'il y a maintenant un numéro de fenêtre libre, utilisez Ctrl + b + . pour renuméroter une fenêtre.

(Astuce : nommez vos fenêtres avec Ctrl + b + , si vous perdez la trace de qui est qui)