322

Sometimes it would be very useful to maximize a pane in tmux and then restore it to it's previous size.

I've been reading the manual and I can't find a way. What I've come up with is that I could bind a key to resize the pane to "max" width, and another key to restore it to some predefined width.

Of course this has its drawbacks, so I'm wondering if anyone has a better idea.

studiohack
  • 13,477
Ivan
  • 4,679

12 Answers12

579

This is now a native tmux feature.

Version 1.8 saw the addition of the -Z flag to resize-pane. From the man page:

With -Z, the active pane is toggled between zoomed (occupying the whole of the window) and unzoomed (its normal position in the layout).

It's bound to tmux-prefix-z by default on my installation (via Homebrew on OS X).

Tyler Holien
  • 5,890
108

tmux 1.8 and later

Now natively supported, from the below answer:

Version 1.8 saw the addition of the -Z flag to resize-pane. From the man page:

With -Z, the active pane is toggled between zoomed (occupying the whole of the window) and unzoomed (its normal position in the layout).

older tmux (original answer)

Another option could be to use break-pane followed by join-pane. From the man page:

break-pane [-d] [-t target-pane]
                   (alias: breakp)
             Break target-pane off from its containing window to make it the
             only pane in a new window.  If -d is given, the new window does
             not become the current window.

join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] (alias: joinp) Like split-window, but instead of splitting dst-pane and creating a new pane, split it and move src-pane into the space. This can be used to reverse break-pane.

So you could select your pane and do break-pane and then once your done with the maximised version, you could re-join it with join-pane - might need some default arguments to put it back in place, or just rearrange afterwards.

Note that join-pane appears to be in tmux 1.3 but not 1.1. (Not sure about 1.2, sorry).

And just to mention that terminator (a GUI (GTK based) terminal multiplexer) can do the zoom thing. (Ctrl-Shift-X is the default keybinding). Of course it doesn't do lots of things that tmux does ...

toraritte
  • 1,128
48

I ran into the same problem, here is how I solved it:

unbind +
bind + new-window -d -n tmux-zoom 'clear && echo TMUX ZOOM && read' \; swap-pane -s tmux-zoom.0 \; select-window -t tmux-zoom
unbind -
bind - last-window \; swap-pane -s tmux-zoom.0 \; kill-window -t tmux-zoom

If your workflow is like mine (i.e. you maximize a window, do some work, then immediately unmaximize it) this should work great for you.

Franck Dernoncourt
  • 24,246
  • 64
  • 231
  • 400
Ryan
  • 481
32

Ctrl + b (prefix) + z works to zoom into a particular pane in tmux 2.1. It you press Ctrl + b + z again, it zoom pane back to original size. It doesn't create a new pane.

Compared to the solution posted above by aksay, if you try to split the zoomed-in pane, it wont allow to split, and will go back to the original pane and split that pane instead.

The zoom window option is probably more versatile...

alpha_989
  • 1,131
  • 12
  • 14
30

Improved zoomer. Now one can zoom multiple panes, even hierarchically. After doing the below and reloading your tmux server (Ctrl-r in my case) you will have your x key bound to zoom in and zoom out a pane. zoom-in is achieved by opening pane in a new window, and zoom-out is achieved by taking a pane back to its original window. If you end up splitting the zoom-in window, you will be able to zoom into the panes of the zoom-in window and zoom-out back to the zoom-in window. zoom-out happens only if you are in a zoom-in window containing a single pane.

Add following to end of your ~/.tmux.conf

~$ grep "bind x" ~/.tmux.conf
unbind x
bind x run ". ~/.tmux/zoom"

Add following file

~$ cat ~/.tmux/zoom
#!/bin/bash -f
currentwindow=`tmux list-window | tr '\t' ' ' | sed -n -e '/(active)/s/^[^:]*: *\([^ ]*\) .*/\1/gp'`;
currentpane=`tmux list-panes | sed -n -e '/(active)/s/^\([^:]*\):.*/\1/gp'`;
panecount=`tmux list-panes | wc | sed -e 's/^ *//g' -e 's/ .*$//g'`;
inzoom=`echo $currentwindow | sed -n -e '/^zoom/p'`;
if [ $panecount -ne 1 ]; then
    inzoom="";
fi
if [ $inzoom ]; then
    lastpane=`echo $currentwindow | rev | cut -f 1 -d '@' | rev`;
    lastwindow=`echo $currentwindow | cut -f 2- -d '@' | rev | cut -f 2- -d '@' | rev`;
    tmux select-window -t $lastwindow;
    tmux select-pane -t $lastpane;
    tmux swap-pane -s $currentwindow;
    tmux kill-window -t $currentwindow;
else
    newwindowname=zoom@$currentwindow@$currentpane;
    tmux new-window -d -n $newwindowname;
    tmux swap-pane -s $newwindowname;
    tmux select-window -t $newwindowname;
fi
akshay
  • 303
12

Now, there is a default shortcut for that:

tmux-prefix+z

which is generally:

Ctrlb+z

Youcef4k
  • 221
2

I did this to maximize/minimize with the same keystroke:

bind C-k run "if [[ $(tmux list-window) =~ ZOOM ]]; then tmux last-window; tmux swap-pane -s ZOOM.1; tmux kill-window -t ZOOM; else tmux new-window -d -n ZOOM; tmux swap-pane -s ZOOM.1; tmux select-window -t ZOOM;fi"
1

The problem with resize-pane -Z being a toggle is that sometimes it will perform the reverse zoom operation than desired, particularly when called from a script or inside tmux.conf.

Here's the work-around:

tmux-zoom-in.sh

#!/bin/bash

# Zoom in the current pane ONLY if it is not currently zoomed.
# Requires tmux version >= 1.8

tmux list-panes -F '#F' | grep -q Z || tmux resize-pane -Z

tmux-zoom-out.sh

#!/bin/bash

# Zoom out the current pane ONLY if it is not currently zoomed.
# Requires tmux version >= 1.8

tmux list-panes -F '#F' | grep -q Z && tmux resize-pane -Z
Tom Hale
  • 2,708
1

Also for me work without 'clear && echo TMUX ZOOM && read'. With this snippet every time I minimize one pane from first window disappear.

Slim
  • 11
  • 1
0

For older versions of tmux, this solution is the only one I've found that works:

https://github.com/jipumarino/tmux-zoom

Brad Parks
  • 3,253
0

For those who can't go with tmux 1.8 or prefer a longer maximized state, I published a tmux script that works with tmux 1.6+.

Hope that helps.

0

I am on Ubuntu 12.04 and also needed this feature. Since tmux 1.8 there is native support for zoom toggling using tmux-prefix z. Since we probably won't see tmux 1.8 in 12.04 I compiled tmux 1.8 from source on another dev computer, renamed it to _tmux-1.8 and just copied the 1.8 binary to /usr/bin/_tmux-1.8 and edited .bash_aliases -> alias tmux='_tmux-1.8'.

I haven't noticed any problems using this quick and dirty method and when/if tmux 1.8 comes to 12.04 I haven't broken anything.

oblivian
  • 101