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.
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
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).
L'équivalent tmux pour :number 42
est :move-window -t 42
.
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
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, .
, reading
pour 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, s
la manière dont vous naviguez dans la session en utilisant Ctrl+b, w
name__.
HTH
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]
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
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.
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
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
.
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.
tmux-pain-control fournit ctrl-b >
et ctrl-b <
pour déplacer la fenêtre focalisée vers la droite et la gauche.
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
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
swap-window -t 5
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
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.
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.
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.
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:
{
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.