How do I reorder tmux windows?

436

161

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.

dan

Posted 2011-02-02T19:53:22.253

Reputation: 5 307

7Reading all the many answers, I still see no easy solution to the OP's question: how to move a given window to position 0 and shift all the rest to the right. Do I really have to manually shift each one to do this? I just want to undo a move I did by mistake (and I'm not sure just what) which I think moved window 0 to window 8 and shifted all the others to the left. – nealmcb – 2014-12-25T20:07:22.023

1

@nealmcb the easiest i could come up with is to set base-index to 1, renumber, then move your window into the empty 0 slot: http://superuser.com/a/1155999/674549

– eMBee – 2016-12-13T06:53:05.380

For difference of swap-window -s number and swap-window -t number to swap current window, see my answer here.

– qeatzy – 2017-10-07T08:47:14.177

See this answer for a bash function to shift range of tmux windows, eg, [2-5] of [0-6] windows.

– qeatzy – 2017-10-07T13:03:31.083

@isomorphismes C-b . renumbers only to a non-existing window number. :swap-window can truly move two existing windows – user989762 – 2018-04-19T20:00:02.897

103C-b, . lets you renumber a window. – isomorphismes – 2014-02-19T01:01:11.760

Answers

491

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

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

matlehmann

Posted 2011-02-02T19:53:22.253

Reputation: 5 026

2You might want to have a look at movew. – Marcello Romani – 2015-02-19T09:57:00.290

3Also, bind-key L swap-window -t -1 to make it the last window. – None – 2017-03-15T14:49:48.767

For difference of swapw -s number and swapw -t number to swap current window, see my answer here.

– qeatzy – 2017-10-07T08:45:36.570

7Thanks 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. – matlehmann – 2013-03-21T15:32:24.400

That's right, I will improve it. – zakkak – 2014-03-23T23:31:33.497

279

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

Ashish Ariga

Posted 2011-02-02T19:53:22.253

Reputation: 2 791

This doesn't appear to work in tmux 1.9a. Can someone else confirm what version this key binding will work on? – rothgar – 2014-07-30T22:47:29.257

4If using letters you need to use a capital letter and not C-S, like this: bind-key -n C-H swap-window -t -1 – Matthew Mitchell – 2014-12-19T15:28:30.183

1I have some problem on 1.9a as well when using Ashish Ariga bind-key -n C-S-Left swap-window -t -1 however it works ok when using the prefix as suggested by @MatthewMitchell – Rho Phi – 2015-08-21T08:09:53.187

1I 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! – Dreamer – 2017-05-02T00:26:33.853

excellent work! sorted my windows out finally ! I turned off numbers on windows – wuxmedia – 2018-02-26T08:41:40.170

what is "Gareth's answer?" – rubo77 – 2019-09-16T23:19:31.600

For tmux >= 3.0, you can use the -d flag. See https://github.com/tmux/tmux/issues/2056

– Andrei Cioara – 2020-02-02T03:43:51.070

11This -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. – brianpeiris – 2013-10-10T13:29:52.440

I came here looking for the quickest way to write these exact bindings. Thanks! – Keith Smiley – 2014-01-06T19:25:49.533

1My inability to easily move tmux windows has been bugging me for a few weeks. This makes it so much easier to deal with the windows! Many thanks from this recent tmux convert. – calvinf – 2014-01-21T20:09:46.970

This is seriously the most useful shortcut in my repertoire, thank you for sharing that. – glitch – 2014-05-17T23:48:24.873

11Great 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. – demure – 2014-06-01T00:35:43.337

67

The tmux equivalent to :number 42 is :move-window -t 42.

Randal Schwartz

Posted 2011-02-02T19:53:22.253

Reputation: 771

I was wondering if the number 42 is a reference to The Hitchhiker's Guide to the Galaxy? – omar – 2014-12-12T00:32:06.257

Omar - of course! It's one of my favorite numbers to use in examples. – Randal Schwartz – 2017-09-21T21:49:41.330

9This is bound to C-b . – vedang – 2011-06-30T12:59:04.890

1Thanks! This is much better than the accepted answer imo. – Ashe – 2012-02-14T22:27:22.367

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 :) – Victor Farazdagi – 2012-03-20T12:30:12.903

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 – engineerDave – 2012-07-24T13:37:19.240

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 – piec – 2013-01-29T23:28:24.650

17

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

isomorphismes

Posted 2011-02-02T19:53:22.253

Reputation: 1 534

12

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

piec

Posted 2011-02-02T19:53:22.253

Reputation: 520

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. – haridsv – 2013-01-23T09:33:07.260

8

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]

Karthik Gurusamy

Posted 2011-02-02T19:53:22.253

Reputation: 181

1This is already nice, but even better would be: do swap-window and if it fails, fall back to move-window – nisc – 2011-12-26T15:18:13.150

5

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

qun

Posted 2011-02-02T19:53:22.253

Reputation: 351

4

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.

jhvaras

Posted 2011-02-02T19:53:22.253

Reputation: 159

6tmux windows and panes are different. – Marcello Romani – 2015-02-19T10:00:14.757

4This still helped me get what I wanted – lkraav – 2015-05-24T12:00:18.820

This question is about windows not panes – mbigras – 2018-08-02T18:59:44.620

3

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

Dave Kuhlman

Posted 2011-02-02T19:53:22.253

Reputation: 31

Would be great a shortcut for moving around splits in a certain window. – Pablo A – 2017-07-15T20:51:53.707

2

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

eMBee

Posted 2011-02-02T19:53:22.253

Reputation: 121

2

tmux-pain-control provides ctrl-b > and ctrl-b < to move the focused window right and left, wrapping around.

pepper_chico

Posted 2011-02-02T19:53:22.253

Reputation: 171

Doesn't work for me in tmux 2.5 – Dmitry Frank – 2018-03-24T17:17:20.203

1

@DmitryFrank ops, right, my bad. It was due to https://github.com/tmux-plugins/tmux-pain-control

– pepper_chico – 2018-03-24T17:31:27.587

Thanks! Managed to set up those two manually, but the plugin looks good in other ways as well. – Dmitry Frank – 2018-03-24T19:00:08.220

2

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 -t -1'
bind-key -n M-Right run-shell 'tmux list-windows | tail -n 1 | grep -q active || tmux swap-window -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 -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'

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.

Alaska

Posted 2011-02-02T19:53:22.253

Reputation: 193

1

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

qeatzy

Posted 2011-02-02T19:53:22.253

Reputation: 227

See this answer for a bash function to shift range of tmux windows, eg, [2-5] of [0-6] windows.

– qeatzy – 2017-10-07T13:08:05.157

1

From the tmux window, try the following to swap window 0 with 1:

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

Hamdi Al-Haj

Posted 2011-02-02T19:53:22.253

Reputation: 11

0

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

Jonatas Eduardo

Posted 2011-02-02T19:53:22.253

Reputation: 101

2Definitely helpful in some scenarios, but this rearranges the panes within a window (rather than reordering windows). – trailing slash – 2016-10-17T22:30:14.850

0

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.

A gif of it in action (github)

steinar

Posted 2011-02-02T19:53:22.253

Reputation: 101

0

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 that 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 # 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

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.

Luke Davis

Posted 2011-02-02T19:53:22.253

Reputation: 173

0

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

rubo77

Posted 2011-02-02T19:53:22.253

Reputation: 2 822

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.

tmux man page

syllogism

Posted 2011-02-02T19:53:22.253

Reputation:

choose-window doesn't seem to move the current window to a new position. – dan – 2011-02-02T20:20:09.970

Also, choose-window is already bound to C-B w. – kynan – 2013-06-10T18:10:14.593

0

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.

mattLummus

Posted 2011-02-02T19:53:22.253

Reputation: 101

Although a helpful tip, this is not answering the question. – Jan Doggen – 2014-10-31T16:17:35.807