Comment réorganiser les fenêtres tmux?

414

Dans screen, je peux simplement taper C-a :number 0pour 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 cela déroutant sur ce point.

dan
la source
95
C-b, .vous permet de renuméroter une fenêtre.
isomorphismes
7
En lisant toutes les nombreuses réponses, je ne vois toujours pas de solution simple à la question du PO: comment déplacer une fenêtre donnée en position 0 et déplacer tout le reste à droite. Dois-je vraiment déplacer manuellement chacun pour faire cela? Je veux juste annuler un mouvement que j'ai fait par erreur (et je ne suis pas sûr de savoir quoi) qui, je pense, a déplacé la fenêtre 0 vers la fenêtre 8 et a déplacé tous les autres vers la gauche.
nealmcb
1
@nealmcb le plus simple que je puisse trouver est de définir l'index de base sur 1, de le renuméroter, puis de déplacer votre fenêtre dans l'emplacement 0 vide: superuser.com/a/1155999/674549
eMBee
Pour la différence swap-window -s numberet swap-window -t numberpour échanger la fenêtre courante, voyez ma réponse ici .
Qeatzy
Voir cette réponse pour une fonction bash permettant de changer la plage de fenêtres tmux, par exemple [2-5] de [0-6] fenêtres.
Qeatzy

Réponses:

467

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

« Prefix: » (c'est Ctrl+ B, :par défaut) vous amène à l'invite tmux-commande. Là vous entrez:

swap-window -s 3 -t 1

de laisser la fenêtre numéro 3 et la fenêtre numéro 1 échanger leurs positions.

Pour échanger la fenêtre actuelle avec la fenêtre supérieure, procédez comme suit:

swap-window -t 0

Dans le cas peu probable où aucune fenêtre ne serait présente à l'indice 0, procédez comme suit:

move-window -t 0

(si base-index est 0, comme c'est le cas par défaut).

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

bind-key T swap-window -t 0
Matlehmann
la source
6
Merci pour votre modification, mais move-windowne fonctionne que s'il n'y a pas une autre fenêtre à l'index donné. Donc, dans la plupart des cas, move-window -t 0cela ne fonctionnera pas, car habituellement, il y aura déjà une autre fenêtre à cette position.
Matlehmann
C'est vrai, je vais l'améliorer.
Zakkak
2
Vous voudrez peut-être jeter un coup d'œil movew.
Marcello Romani,
3
Aussi, bind-key L swap-window -t -1pour en faire la dernière fenêtre.
Pour la différence swapw -s numberet swapw -t numberpour échanger la fenêtre courante, voyez ma réponse ici .
Qeatzy
257

En ajoutant à 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

Appuyez sur Ctrl + Maj + Gauche (pour déplacer la fenêtre actuelle vers la gauche. De même pour la droite. Inutile d'utiliser le modificateur (Cb).

Ashish Ariga
la source
9
Ceci -1et la +1syntaxe aident à résoudre le problème des indices occupés. tmux changera les autres fenêtres pour vous et l’événement se déroulera automatiquement jusqu’à la fin. C'est la meilleure réponse.
brianpeiris
1
Mon incapacité à déplacer facilement tmux windows me perturbe depuis quelques semaines. Cela facilite grandement le traitement des fenêtres! Merci beaucoup de cette récente conversion de tmux.
Calvinf
8
Excellent conseil, préférez bind-key S-Left swap-window -t -1, afin que je puisse faire <préfixe> Maj + flèche, car je n'aime pas gâcher les raccourcis clavier des programmes.
Demure
4
Si vous utilisez des lettres, vous devez utiliser une lettre majuscule et non CS, comme ceci:bind-key -n C-H swap-window -t -1
Matthew Mitchell
1
J'ai un problème avec 1.9a également lors de l'utilisation d'Ashish Ariga, bind-key -n C-S-Left swap-window -t -1mais cela fonctionne correctement lorsque vous utilisez le préfixe suggéré par @MatthewMitchell
Rho Phi
63

L'équivalent de tmux :number 42est :move-window -t 42.

Randal Schwartz
la source
9
Ceci est lié à Cb.
vedang
1
Merci! C'est beaucoup mieux que la réponse acceptée imo.
Ashe
5
@ArlenCuss En fait, les deux réponses sont bonnes et utiles. Vous voyez, en utilisant screen: number, vous pouvez échanger des fenêtres, en utilisant: move-window de tmux, vous ne pouvez déplacer la fenêtre que si l’index cible n’est pas utilisé. Donc, imo, à la fois: swap-window et: move-window sont nécessaires pour maîtriser l'emplacement de la fenêtre :)
Victor Farazdagi
1
+1 pour obtenir une réponse d'un gourou de la programmation (aussi pour être correct). C'est la seule façon pour moi de le faire fonctionner sur une fenêtre active
engineerDave
4
tmux :move-windown'est pas équivalent à screen :number. :numberéchange si la destination existe, :move-windowéchoue dans ce cas. Vous devez choisir entre :move-windowet:swap-window
piece le
15

Je renumérote les fenêtres comme ceci:

Ctrl+ b, .,222

rendrait la tmuxfenêtre en cours (tous les volets) numéro 222.


Relativement: quand je remue les choses j'ai tendance à vouloir faire

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

et de là , je peux aussi utiliser Ctrl+ b, ., readingpour déplacer la fenêtre en cours (toutes les vitres à la fois) au cours de la séance de lecture. Vous pouvez naviguer entre les sessions avec Ctrl+ b, sla façon dont vous naviguer à l' intérieur session en utilisant Ctrl+ b, w.

HTH

isomorphismes
la source
12

Vous pouvez mettre en œuvre un équivalent à screenl » numbercommande en utilisant un script shell externe qui choisit entre swap-windowet 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
pièce
la source
2
Très belle solution, fonctionne très bien! Je viens d’apporter des modifications mineures au nettoyage et de supprimer l’ -Foption qui n’est pas acceptée par ma version de tmux.
haridsv
8

Utiliser la fenêtre d'échange pour passer à n'importe quel identifiant: [le plus proche de: numéro de l'écran]

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

[m pour le déplacement -> appuyez sur prefix-m et entrez say 3. . renuméroter la fenêtre en 3]

Karthik Gurusamy
la source
1
C'est déjà bien, mais le mieux serait: faites swap-window et si ça échoue, retournez à move-window
nisc
5

Depuis la réponse de Ashish Ariga ne fonctionne pas sur la version 1.9a et inférieure. J'utilise <et >permute la 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
qun
la source
4

La solution la plus simple de man, consiste à utiliser les liaisons par défaut:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
Jhvaras
la source
6
Les fenêtres et les volets tmux sont différents.
Marcello Romani le
4
Cela m'a encore aidé à obtenir ce que je voulais
lkraav
Cette question concerne les fenêtres et non les vitres
mbigras
3

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

Ctrl-Shift-F3
Ctrl-Shift-F4

La liaison de clé définie par byobupour 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
Dave Kuhlman
la source
Ce serait un bon raccourci pour se déplacer dans une fenêtre donnée.
Pablo Un
2

L'approche que j'utilise combine un peu de la réponse d'Ashish à celle de morceaux; Les flèches alt gauche et droite sont liées à une petite légende de shell rapide qui déplace la fenêtre vers la gauche ou la droite, à moins que ce ne soit la première ou la dernière fenêtre, avec respect. Je l'ai fait parce que, lorsque vous émettez un échange +1 à la dernière fenêtre (ou -1 à la première fenêtre), il sera toujours échangé au lieu de revenir en boucle comme vous le souhaitiez:

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

Ainsi, 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 windows -index et renumber-windows pour obtenir une liste de fenêtres qui commencent à un nombre arbitraire et qui ne présentent jamais de lacunes.

Si vous utilisez l' indice de base 1 comme moi et que vous ne pensez pas aller au-delà de 999 fenêtres, vous pouvez utiliser un petit truc pour le faire rouler correctement, même si les commandes sont un peu trop lourdes:

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é, puis en appelant move-window -r pour les renuméroter à partir de 1. Cela fonctionne de la même manière lorsque vous déplacez la première fenêtre à la fin. en choisissant un nombre énorme que vous n'utiliserez jamais, cela garantira que lorsque move-window -r se déclenchera à nouveau, tout sera numéroté comme vous le souhaitiez. Si vous vous interrogez sur refresh-client -S , cela est nécessaire car, parfois, même si la réorganisation à partir de la fenêtre de déplacement fonctionne correctement, la barre d'état ne se met pas à jour tant que d'autres modifications ne sont pas apportées. En évitant d'actualiser uniquement la barre d'état (-S), vous évitez cela.

Le seul problème que je puisse trouver avec cette approche est que swap-window modifiera implicitement la dernière fenêtre utilisée par celle avec laquelle vous avez échangé. Ainsi, si vous êtes sur la fenêtre n ° 1, passez à la fenêtre quatre et déplacez-la d'une seconde, 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.

Alaska
la source
2

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

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

Lorsque vous avez terminé, vous pouvez réinitialiser base-indexà 0si vous souhaitez utiliser move-window -rplus tard sans déplacer votre fenêtre à0

eMBee
la source
2

tmux-pain-control fournit ctrl-b >et permet ctrl-b <de déplacer la fenêtre focalisée vers la droite et la gauche, en l’enveloppant.

pepper_chico
la source
Ca ne marche pas pour moi dans tmux 2.5
Dmitry Frank
1
@ DimitryFrank ops, c'est vrai, mon mauvais. C'était dû à github.com/tmux-plugins/tmux-pain-control
pepper_chico
Merci! Nous avons réussi à configurer ces deux éléments manuellement, mais le plugin a également une belle apparence.
Dmitry Frank
1

Les deux swap-window -s 5et swap-window -t 5échanger 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 reviendra à l'état précédent.

swap-window -t 5

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

le numberdans swap-window -s numberet -t numberpourrait être à la fois absolu , par exemple 5, et relatif , par exemple -1, +2.

PS ci-dessous est un extrait de tmux statusline illustrant l’effet deswap-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

qeatzy
la source
Voir cette réponse pour une fonction bash permettant de changer la plage de fenêtres tmux, par exemple [2-5] de [0-6] fenêtres.
Qeatzy
1

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

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

Hamdi Al-Haj
la source
0

Je pense que vous souhaitez lier une nouvelle combinaison de touches à la commande 'choisir une fenêtre'.

Je sais que vous avez dit que vous avez déjà lu la page de manuel, mais vous devriez vous y reporter. vous devez modifier votre fichier ~ / .tmux.conf pour ajouter une commande bind-key.

Plus précisément, regardez à la page 4 de ce qui suit.

Page de manuel de tmux


la source
choose-windowne semble pas déplacer la fenêtre actuelle vers une nouvelle position.
Dan
En outre, choose-windowest déjà lié à C-B w.
Kynan
0

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 supérieur (index non utilisé) et le réorganiser dans l'espace où se trouvait l'index précédent.

Supposons que vous ayez 3 fenêtres et que vous vouliez en ajouter une quatrième, mais à l’endroit où elles étaient auparavant.

Avant d’ajouter une nouvelle fenêtre: préfixe Tmux alors. ouvrira la commande de déplacement. Tapez 4 et l'index de 3 deviendra 4, puis ajoutez simplement une autre fenêtre et ce sera à l'index 3 et votre ancienne fenêtre sera toujours à l'index 4.

MattLummus
la source
Bien que ce soit un conseil utile, cela ne répond pas à la question.
Jan Doggen
0

Tout d’abord, ouvrez la commande tmux, puis appuyez sur et relâchez:

Ctrl + b 

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

}

Pour changer la fenêtre réelle à gauche:

{
  • N'oubliez pas d'utiliser SHIFTquand presse }ou {.
Jonatas Eduardo Salgado
la source
2
Certainement utile dans certains scénarios, mais cela réorganise les volets dans une fenêtre (plutôt que de réorganiser les fenêtres).
slash de fuite
0

Pour ce que ça vaut:

J'ai piraté ce script pour pouvoir commander toutes les fenêtres dans un "TUI". Il répertorie toutes vos fenêtres dans un fichier temporaire, l'ouvre avec votre éditeur par défaut (en supposant que vous ayez défini $ EDITOR). Après cela, vous pouvez réorganiser les lignes et après avoir enregistré et fermé le fichier, les fenêtres sont réorganisées en conséquence. (Ceci est similaire à la commande commet quand on fait 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 beaucoup amélioré, en particulier:

REMARQUE : vous pourriez être déplacé vers une autre fenêtre après avoir exécuté la commande.

Un gif en action (github)

steinar
la source
0

Aucune des réponses ici ne m'a satisfait, alors j'ai écrit un script qui imite (en quelque sorte) le screencomportement de déplacement de fenêtre tmux.

Il détecte si le numéro de la fenêtre de destination est plus petit que le numéro de la fenêtre le plus petit ou est supérieur au numéro de la fenêtre le plus grand. . Ceci est fait avec la move-windowcommande.

Si le numéro de fenêtre se situe entre les plus petits / plus grands nombres (c'est-à-dire, correspond probablement à un numéro de fenêtre existant), il les échange simplement avec la swap-windowcommande.

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, ajoutez simplement cette liaison de clé simple à votre .tmux.conf:

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

Remarque : pour imiter parfaitement le screencomportement de permutation de fenêtre, je pense 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 décalées vers la droite . Il serait assez simple de modifier ce script pour le faire.

Luke Davis
la source
0

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

Il suffit de déplacer vos fenêtres avec

Ctrl+ b+:

puis entrez le nouveau numéro de fenêtre (libre) et appuyez sur Enter

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 laquelle)

rubo77
la source