In screen
, I can just type C-a :number 0
to move a window to the top of the window list and push all the other windows down one. What's the equivalent command sequence for tmux
? I looked at the man page, but I'm finding it confusing on this point.
25 Answers
The swap-window
command is closest to what you want.
"Prefix :" (that is Ctrl+B, : by default) brings you to the tmux-command prompt. There you enter:
swap-window -s 3 -t 1
to let window number 3 and window number 1 swap their positions.
To swap the current window with the top window, do:
swap-window -t 0
In the unlikely case of having no window at index 0, do:
move-window -t 0
(if base-index is 0, as it is by default). Command move-window -t <NUMBER>
is by default bound to Ctrl+B, ..
You can bind that command to a key (T for "top" for example) by adding the following to your ~/.tmux.conf
:
bind-key T swap-window -t 0
-
8Thanks for your edit, but
move-window
only works, if there is not another window at the given index. So in most cases,move-window -t 0
will not work, since usually there will be another window at that position already. Commented Mar 21, 2013 at 15:32 -
-
4
-
9Also,
bind-key L swap-window -t -1
to make it the last window.– user373230Commented Mar 15, 2017 at 14:49 -
For difference of
swapw -s number
andswapw -t number
to swap current window, see my answer here.– qeatzyCommented Oct 7, 2017 at 8:45
Adding to Gareth's answer, you can use the following key bindings
bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1
Pressing Ctrl+Shift+Left (will move the current window to the left. Similarly right. No need to use the modifier (C-b).
For tmux 3.0 version, you should use following key bindings
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
-
15This
-1
and+1
syntax helps solve the problem of occupied indices. tmux will shift the other windows for you and will event wrap around to the end/beginning automatically. This is the best answer. Commented Oct 10, 2013 at 13:29 -
19Great hint, prefer
bind-key S-Left swap-window -t -1
, so I can do <prefix> shift+arrow, as I don't like messing up key binds for programs.– demureCommented Jun 1, 2014 at 0:35 -
6If using letters you need to use a capital letter and not C-S, like this:
bind-key -n C-H swap-window -t -1
Commented Dec 19, 2014 at 15:28 -
4I like the idea of binding key C-S-Left/Right. However, when I was trying this on my Mac(10.12.4 Sierra) with tmux 2.3, it's not working. I'm not sure if it's captured by the Terminal.app or other system settings. Any help would be appreciated!– DreamerCommented May 2, 2017 at 0:26
-
11For tmux >= 3.0, you can use the -d flag. See github.com/tmux/tmux/issues/2056 Commented Feb 2, 2020 at 3:43
The tmux equivalent to :number 42
is :move-window -t 42
.
-
14
-
1
-
6@ArlenCuss Actually both answers are good and useful. You see, using screen :number you could swap windows, using tmux's :move-window you can only relocate window if the target index is not in use. So, imo, both :swap-window and :move-window are necessary to grasp control over window locations :) Commented Mar 20, 2012 at 12:30
-
1+1 for getting an answer from a programming guru (also for being correct). This is the only way I could get it to work on an active window Commented Jul 24, 2012 at 13:37
-
6tmux's
:move-window
is not equivalent to screen's:number
.:number
swaps if the destination exists,:move-window
fails in that case. You have to choose between:move-window
and:swap-window
– piecCommented Jan 29, 2013 at 23:28
I renumber windows like this:
Ctrl+b, .
, 222
would make the current tmux
window (all panes) number 222.
Relatedly: When I'm shuffling things around I tend to want to do
Ctrl+b :new-session -d -s "reading"
and from there I can also use Ctrl+b, .
, reading
to move the current window (all panes at once) over to the reading session. You can browse among sessions with Ctrl+b, s
the way you would browse within session using Ctrl+b, w
.
HTH
You can implement an equivalent to screen
's number
command using an external shell script that chooses between swap-window
and move-window
. You can bind it to a key that way:
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
-
2Very nice solution, working great! I just made minor edits to cleanup and removed the
-F
option which is not accepted by my tmux version.– haridsvCommented Jan 23, 2013 at 9:33
Since Ashish Ariga's answer doesn't work on version 1.9a and below. I use <
and >
to swap window to left and right, respectively, by adding the line below to .tmux.conf
.
# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
-
Adding -d flag to swap-window focuses on the current window that's being moved– MosaalebCommented Sep 11, 2020 at 10:05
-
-
This one solved my problem. Couldn't use the keys shortcut from here: superuser.com/a/552493/265896.– jokerCommented Dec 13, 2021 at 17:32
tmux-pain-control provides ctrl-b >
and ctrl-b <
to move the focused window right and left, wrapping around.
-
-
1@DmitryFrank ops, right, my bad. It was due to github.com/tmux-plugins/tmux-pain-control– oblitumCommented Mar 24, 2018 at 17:31
-
Thanks! Managed to set up those two manually, but the plugin looks good in other ways as well. Commented Mar 24, 2018 at 19:00
-
Using swap-window to move to any id: [closest to screen's :number]
# window movement / renumbering like in screen's :number
bind-key m command-prompt -p "move window to:" "swap-window -t '%%'"
[m for move --> hit prefix-m and enter say 3 . .to renumber window to 3]
-
2This is already nice, but even better would be: do swap-window and if it fails, fall back to move-window– niscCommented Dec 26, 2011 at 15:18
I'm surprised that no one found this out, but after digging in the tmux man page, you can use
move-window -b -t <target-window>
to move to the current window to before the target window.
So to do exactly what the OP is asking, do this:
move-window -b -t 0
-
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.– Community BotCommented Jan 29, 2023 at 20:51
-
2I think this is the right way (upvoted). Regarding "I'm surprised that no one found this out": the question is from 2011, many answers are old; AFAIK the support for
-b
intmux move-window
was added in tmux 3.2 released Apr 13, 2021. Commented Jan 29, 2023 at 21:04 -
This should be the accepted answer, all the more so since very few people know about this option. The first thing I did upon discovering it was go and redefine
<Prefix> .
, whose default binding is utterly useless:bind . command-prompt -T target { move-window -b -t "%%" } \; move-window -r
BTW, I don't quite understand whymove-window -r
has to be called separately. Wouldn't it be cool ifmove-window -b -t <NUM> -r
could move the window AND renumber the whole thing in one go?– wildekatCommented May 15, 2024 at 18:01 -
For sane and easy window swapping:
# Bind P and N (capitals) to moving the current window around.
bind-key N swap-window -t +1 \; next-window
bind-key P swap-window -t -1 \; previous-window
With \;
you can combine two commands to one keybinding. So we first swap the window, then we move the focus to that (original) window.
So when you do prefix -> Shift + N
, it moves the current window one forward, and keeps the focus on that window.
It puzzles me why there's not a direct command for this in tmux. Why would you want something more complicated? Anyway, this fixes it.
-
fantastic, this is by far my favorite answer, and works like a charm -- very intuitive! Commented May 3, 2023 at 3:04
Most simple solution from man
, is to use the default bindings:
{ Swap the current pane with the previous pane.
} Swap the current pane with the next pane.
-
9
-
6
-
For those of you who use byobu
as your wrapper for tmux, you can swap the current window with the previous or next window with:
Ctrl-Shift-F3
Ctrl-Shift-F4
The key binding defined by byobu
for these keys may be of interest:
bind-key -n C-S-F3 swap-window -t :-1
bind-key -n C-S-F4 swap-window -t :+1
-
Would be great a shortcut for moving around splits in a certain window.– Pablo ACommented Jul 15, 2017 at 20:51
The approach I use combines a bit of Ashish's answer with piec's; I have alt-left and right arrow bound to a quick little shell callout that moves the window one to the left or the right, unless it is the first or last window, respectfully. I did this because, when you issue a swap +1 at the last window (or swap -1 at the first window), it will still swap, instead of looping back around again like you might expect:
0:one 1:two 2:three 3:zero*
Becomes
0:zero* 1:two 2:three 3:one
Instead of
0:zero* 1:one 2:two 3:three
So, the commands I use stop working when the window has reached the edge of the list:
bind-key -n M-Left run-shell 'tmux list-windows | head -n 1 | grep -q active || tmux swap-window -d -t -1'
bind-key -n M-Right run-shell 'tmux list-windows | tail -n 1 | grep -q active || tmux swap-window -d -t +1'
This can easily be combined with base-index and renumber-windows to have a list of windows that start at an arbitrary number and never has any gaps.
If you are using base-index 1 like me and you don't think you'll ever go above 999 windows, you can use a little trick to make it roll properly, though the commands bloat a bit:
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 -d -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 -d -t +1 ; fi'
This works by temporarily moving the last window to the unused index-0 and then calling move-window -r to renumber them starting from 1 again. It works similarly when moving the first window to the end; by picking a huge number you'll never use, it ensures that when move-window -r fires again everything will be numbered like you'd expect. If you're wondering about refresh-client -S, that's necessary because sometimes, while the reordering from move-window will work properly, the status bar won't update until further changes are made. By forcing a refresh of just the status bar (-S), you avoid this.
The only issue I can find with this approach is that swap-window will implicitly alter the last-used window to the one you swapped with. Thus, if you are on window #1, switch to window four and move it back one, you'll find that your last-used window is the new # 4 (formerly #3) instead of #1. There doesn't seem to be a way around this.
EDIT in 2020: Recent tmux versions require -d
to keep the old behavior of moving the current window and staying with it in its new position.
-
This works great, I had an external script that achieves the same thing in 20 lines of code, your bind-key calls are much simpler and more efficient. Just one note for 2020 - current tmux versions don't make the swapped window automatically selected, so after
swap-window -t -1;
I needed to addtmux previous-window;
and afterswap-window -t +1;
I had to addtmux next-window;
– Rafał G.Commented Sep 10, 2020 at 20:54 -
Thanks for the update, but this solution loops around when the windows hit the edge. It's better to use
swap-window -d
to get the old behavior, I will update my answer. Commented Nov 30, 2020 at 18:11 -
you can use base-index
to change the starting number for your windows.
if you set base-index
to 1
, then move-window -r
will renumber all windows starting at 1
, thus freeing up 0
to move a window into its slot:
set base-index 1
move-window -r
move-window -t 0
when done, you could reset base-index
to 0
if you want to use move-window -r
later without moving your window at 0
Both swap-window -s 5
and swap-window -t 5
swap current window with window 5, but with different semantics.
swap-window -s 5
- window 5 program in effect with current win number.
- recent window number remain unchanged.
- repeat same command will roll back to previous state.
swap-window -t 5
- current program in effect with number 5.
- recent override to current window number.
the number
in swap-window -s number
and -t number
could be both absolute, eg, 5, and relative, eg, -1, +2.
P.S.
below is excerpt of tmux statusline illustrating effect of swap-window -s 5
recent:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc
now, after last-window
:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc
after swapw -s 5
:
[0] 0:mc* 1:mpl 2:py2- 3:numpy 4:plot 5:vim
another swapw -s 5
:
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc
another last-window
:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc
-
See this answer for a bash function to shift range of tmux windows, eg, [2-5] of [0-6] windows.– qeatzyCommented Oct 7, 2017 at 13:08
No need for the commandline (which is Ctrl + b and then :)
Just move your windows around with
Ctrl + b + :
then enter the new (free) window number and hit Enter
If there is no free window number, use Ctrl + b + . to renumber a window.
(Tip: name your windows with Ctrl + b + , if you loose track of which is which)
From the tmux window, try the following to swap window 0 with 1:
$ tmux swap-window -d -s 0 -t 1
I discovered the desired behaviour is possible with the following options set:
set -g base-index 1
set -g pane-base-index 1 # for consistency
set-option -g renumber-windows on
bind 0 move-window -t0
If base-index is 1, it allows position 0 to be assigned to still, and the renumbers, freeing up position 0 again. Now C-b 0
will work as does C-b . 0
I think you want to bind a new key combination to the 'choose-window' command.
I know you said you've already read the man page, but you should refer back to it. you need to modify your ~/.tmux.conf file to add a bind-key command.
Specifically, look at page 4 of the following.
-
choose-window
doesn't seem to move the current window to a new position.– danCommented Feb 2, 2011 at 20:20 -
This is the method I use. You still can't move a window to an occupied index, but you can move one to a higher (unused index) and rearrange in the gap where the previous index was.
Say you have 3 windows and want to add a fourth but in the place where 3 previously was.
Before you add a new window: Tmux prefix then . will open up the move command. Type in 4 and the index of 3 will now become 4, then simply add another window and it will be at index 3 and your old window will still be at index 4.
-
Although a helpful tip, this is not answering the question. Commented Oct 31, 2014 at 16:17
First, open the tmux command press and release:
Ctrl + b
And to change the actual window to the right window (in circular order), just do:
}
To change the actual window to left:
{
- Don't forget to use
SHIFT
when press}
or{
.
-
2Definitely helpful in some scenarios, but this rearranges the panes within a window (rather than reordering windows). Commented Oct 17, 2016 at 22:30
For what it's worth:
I hacked this script together to be able to order all the windows in a "TUI". It lists all your windows in a temporary file, opens it with your default editor (assumes that you've set $EDITOR). After this you can reorder the lines and after you save and close the file, the windows are reordered accordingly. (This is similar to ordering commits when doing 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
It could probably be improved upon a lot, in particular:
NOTE: You might be moved to another window after running the command.
None of the answers here satisfied me, so I wrote a script that (sort-of) mimicks the screen
window-moving behavior for tmux
.
It detects whether the destination window number is smaller than the smallest window number or bigger than the biggest window number, and if so, nudges all the other windows to the right or left (respectively) and re-numbers them to from 1 - N incrementally. This is done with the move-window
command.
If the window number is in-between the smallest/biggest numbers (i.e., presumably, matches an existing window number), it just swaps them with the swap-window
command.
Here's the 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
tmux move-window -t:$((maxwin + 1))
winlist=($(tmux list-windows | cut -d: -f1 | xargs))
for n in ${winlist[@]}; do
i=$((i + 1))
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[@]} # start at highest indexed window
for n in ${winlist[@]}; do
tmux move-window -s:$n -t:$i
i=$((i - 1))
done
# In-between; just a simple swap
else
tmux swap-window -t:$2
fi
Then, just add this simple key-binding to your .tmux.conf
:
bind m command -p "Send window to:" "run -b '~/tmux-windowswap #I %1'"
Note: To perfectly mimick screen
window-swapping behavior, I believe when you move a window to an existing window number, it should take that window's place and all the other windows are nudged to the right. It would be fairly simple to modify this script to do so.
This can also be done the following way:
Ctrl+M to mark the first window,
and running :swap-windows
from another window
This will swap them without having to know/remember the index numbers
As answered already the command is:
Ctrl+b,:move-window -t NUM
For those that came from screen, like the OP, and prefer the old method, you can add an alias to your tmux configuration file to keep using the :number command.
set -a -s command-alias number="move-window -t "
Now you can use Ctrl+b,:number 5
to set the current window number to 5.
C-b
,.
lets you renumber a window.C-b .
renumbers only to a non-existing window number.:swap-window
can truly move two existing windows