291

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.

0

12 Answers 12

82

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

4
  • 35
    As of version 1.8 there is a better solution (see Tyler Holien's answer).
    – momeara
    Oct 30, 2013 at 13:19
  • 1
    For those that try this before the better answer, to get join-pane to work do: join-pane -t:{previous} for the previous window or join-pane -t:0 to join it back to window 0.
    – Realistic
    Jan 12, 2018 at 22:57
  • 16
    C-b-z is the answer I think most people are looking for. Feb 16, 2020 at 0:51
  • "Can't break with only one pane" Mar 23, 2021 at 18:34
545

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

6
  • 5
    this was great, just added to my .tmux.conf and now have a far more fluid experience: bind-key z resize-pane -Z Aug 5, 2014 at 13:23
  • 1
    Is it possible to somehow have the edges of the submerged panes visible for depth indication? I keep forgetting I'm zoomed in and the "Z-title" isn't really prominent enough.
    – lkraav
    Feb 21, 2016 at 23:15
  • Works in BunsenLabs out of the box. Apr 2, 2016 at 20:37
  • 1
    @lkraav See Change Tmux background colour of zoomed pane. Jul 30, 2019 at 9:30
  • @Ivan could you make this accepted answer.
    – andilabs
    Sep 10, 2019 at 9:38
49

So I know you asked this a while ago ... but I didn't switch from screen until today!

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.

9
  • (In case it wasn't clear, this maintains the layout in your original window...after maximizing and un-maximizing, it's exactly the same.)
    – Ryan
    Nov 15, 2011 at 20:22
  • 2
    Any idea how I could map the same keystroke to both? Something like bind c-m select-window -t tmux-zoom ? <minimize> : <maximize>. But now I want to define this function somewhere else, for the sake of cleanliness, and just bind c-m :max_or_min. Is that possible? I'm finding it hard to search for. (I find I often hit the wrong command and end up creating additional, empty 'tmux-zoom' windows.)
    – chadoh
    Apr 3, 2012 at 13:44
  • 7
    This worked for me only when I removed 'clear && echo TMUX ZOOM && read' from maximize.
    – Epeli
    Apr 8, 2012 at 18:32
  • Thw maximise works for me, but the minimise action just kills the the original window, leaving the maximised pane.
    – paradroid
    Apr 15, 2012 at 11:53
  • This sort of worked, but I lose my layout.. almost though!
    – John Hunt
    Jul 4, 2012 at 10:23
28

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
9
  • 4
    Only a single upvote?! This answer is awesome! Works very well, introduces nice new functionality which now completely replaces the bloaty 'terminator' program I used to use.
    – sillyMunky
    Aug 27, 2012 at 10:49
  • +1 This is really good! By far the best working solution I've come across so far! Thanks!!
    – armandino
    Nov 8, 2012 at 6:07
  • I concur. This works, and is more than awesome. It's screen++
    – Brad Parks
    Mar 6, 2013 at 3:28
  • +1. This works great but it's a fraction of a second (~0.8s) slower than @Ryan's answer above, at least on my system. Not a big deal, but I wonder if there is a way to make it faster Mar 6, 2013 at 15:55
  • Beautiful indeed. I love the special pane names (zoom@…), which are useful reminders, and the single "x" zoom in/out command. Jun 9, 2013 at 14:26
24

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

0
8

Now, there is a default shortcut for that:

tmux-prefix+z

which is generally:

Ctrlb+z

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

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

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

0

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

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.