web-dev-qa-db-fra.com

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

393
dan

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. 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
438
matlehmann

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 (C-b).

246
Ashish Ariga

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

63
Randal Schwartz

Vous pouvez implémenter une commande équivalente à 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
12
piec

Je renumérote les fenêtres comme ceci:

Ctrl+b, ., 222

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


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

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

et à partir de là je peux aussi utiliser Ctrl+b, ., readingpour déplacer la fenêtre active (tous les volets à la fois) vers la session de lecture. Vous pouvez naviguer entre les sessions avec Ctrl+b, sla manière dont vous naviguez dans la session en utilisant Ctrl+b, wname__.

HTH

12
isomorphismes

Utiliser swap-window pour passer à n'importe quel identifiant: [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]

8
Karthik Gurusamy

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

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.
3
jhvaras

Pour ceux d'entre vous qui utilisent byobu comme 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 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
3
Dave Kuhlman

vous pouvez utiliser base-index pour changer le numéro de départ de vos fenêtres. si vous définissez base-index sur 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:

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

lorsque vous avez terminé, vous pouvez réinitialiser base-index à 0 si vous souhaitez utiliser move-window -r ultérieurement sans déplacer votre fenêtre à 0.

2
eMBee

L'approche que j'utilise combine un peu de la réponse d'Ashish à celle de piece; Les flèches alt gauche et droite sont liées à une petite légende rapide de Shell 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 effectuez 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 souhaiteriez:

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'

Ceci peut facilement être combiné avec base-index et renumber-windows pour avoir une liste de fenêtres qui commencent par un nombre arbitraire et ne présentent jamais de lacunes.

Si vous utilisez base-index 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 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 manière similaire lorsque vous déplacez la première fenêtre à la fin. en choisissant un nombre énorme que vous n'utiliserez jamais, cela garantit 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 , c'est nécessaire, car parfois, même si la réorganisation de move-window fonctionne correctement, la barre d'état ne sera pas mise à jour tant que d'autres modifications ne seront 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.

2
Alaska

tmux-pain-control fournit ctrl-b > et ctrl-b < pour déplacer la fenêtre focalisée vers la droite et la gauche.

2
pepper_chico

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

1
Hamdi Al-Haj

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 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 actuelle.

number dans swap-window -s number et -t number peuvent être tous les deux absolu , par exemple 5 et relatif , par exemple -1, +2.

P.S. ci-dessous est un extrait de tmux statusline 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
qeatzy

Aucune des réponses ici ne me satisfaisait. J'ai donc écrit un script qui imite (en quelque sorte) le comportement screen en déplaçant la fenêtre pour 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 plus grand que le numéro de la fenêtre le plus grand, et si tel est le cas, déplace toutes les autres fenêtres à droite ou à gauche les numérote à partir de 1-N progressivement. Ceci est fait avec la commande move-window.

Si le numéro de fenêtre est entre les deux le plus petit/le plus grand nombre (c’est-à-dire, correspond probablement à 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, ajoutez simplement cette liaison de clé simple à votre .tmux.conf:

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

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

0
Luke Davis

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

0
syllogism

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.

0
mattLummus

Commencez par ouvrir la commande tmux

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 SHIFT lorsque vous appuyez sur } ou {.

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 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 beaucoup amélioré, en particulier:

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

Un gif de celui-ci en action (github)

0
steinar