All professions and crafts have tools. Mastering the tools is a big part of being successful and software development is no different. If anything, there are more tools to choose from in each and every area. In this article I'll introduce tmux — one of the best tools for managing multiple interactive sessions. This is an essential activity for developers and sys admins who work with distributed systems and need to access multiple remote machines on a regular basis.
What Is Tmux?
Tmux stands for Terminal Multiplexer. A terminal is the console window in which you type commands in most operating systems. Tmux is designed for Unix-like operating systems and runs on pretty much everything you're likely to use: Limux, OSX, Solaris, FreeBSD and NetBSD. You can find tmux here. Tmux lets you split your terminal window into multiple terminals and manage them. In addition, tmux lets you manage different sessions and re-attach them to existing sessions. That turns out to be the killer feature because it is very common to use tmux to manage interactive sessions with remote systems and those sessions tend to disconnect. With tmux you attach to your previous session and all your state is saved (unless the remote machine went down).
Ok, let's create a session. Open your terminal and type
'tmux new -s devx'. You should see something like:
Not too exciting so far. It looks like a regular terminal window except for the green bar at the bottom.
We can start an application now inside our tmux session as usual. For example, I can start vim, by typing 'vim':
When you're inside a tmux session you operate in two contexts — tmux itself and the terminal or application that runs in the active pane inside tmux. When you type commands who should respond to these commands? Well, it depends. Sometimes you want to talk to the application and sometimes you want to talk to tmux. To disambiguate, tmux uses a key combination called prefix. That prefix is by default
<ctrl>-b. Many people change that to
<ctrl>-a which is the prefix for a similar, but less powerful program, called 'screen'. Many ex-screen users migrated to tmux but kept the
ctrl-<a> prefix. To keep it generic and save some space I'll just use
<p> for prefix from now own. Remember that if you didn't change anything in your tmux configuration
<p> stands for
For example, to detach from a session type
<p>d, which really means press
<ctrl> and b at the same time, release both and the press 'd'.
You should see that vim disappeared along with the cool green bar and you're back at the terminal where it says [detached].
Have no fear, nothing is lost. We can get back to our vim session. First, let's check out our tmux sessions by typing 'tmux list-sessions':
You can see our 'devx' session right there. Let's get back to our session. Type:
tmux attach-session -t devx
And, we're back. Enjoy your vim session.
Pane and Window Management
Let's get to the bread and butter of tmux — multiple panes. With tmux you're always inside of a pane. When you start a new session there is just a single session. To create additional sessions you can split the current pane into two panes. You can split vertically or you can split horizontally.
To split horizontally type: <p>%
To split vertically type: <p>"
Here is what the screen looks like after I type both commands one after the other:
Note, that the cursor is now in the bottom right pane and the green bar says: "
0:bash*" to reflect the fact that the application running in the active pane is bash.
Closing a pane is as simple as typing
<ctrl>-d. Note that if you close the last pane, you effectively close your tmux session. You will not be able to attach again because there is nothing to which something could be attached. So, pay attention to the difference between detaching from a session vs. closing a session (closing the last pane).
To move between panes use
<p><arrow-key>. That is simply click on the arrow key corresponding to the direction you want to move to. Some people have really intricate layout with lots of small panes and navigating between them with the arrow keys can be a little tedious. You can go directly to a particular pane too. To do that type
<p>q. Tmux will display briefly a big number on each pane. While the numbers are visible, type the number and there you are.
Here is a crazy pane configuration that can definitely benefit from direct navigation
You can also resize panes in different directions by typing the following command:
<p>:resizep -<direction> <amount>
The direction is L, R, U or D (I'm sure you can guess what they stand for) and the amount is the number of characters to grow by. For example, to grow the active pane by 10 characters to the right type:
<p>:resizep -R 10
Tmux supports windows too. Each window takes over the whole screen and can have it split into its own panes. To create a new window type:
Navigating between windows can be done by
<p>n for next window and
<p>p for previous window. If you prefer selecting from a visual list type
<p>w that will display a list of all windows.
To close a window you can close all its panes or to close immediately type
Tmux will ask you if you're sure:
One common issue when working with tmux is that panes are often small and to see their contents you need to scroll them. No problem. Tmux has got you covered with the
<p>[ command. This is called copy mode and lets you scroll up and down the active pane with the arrow keys. Vim commands are supported as well (e.g. :<line number> or G to jump to the bottom). Note that in copy mode no prefix is needed to navigate around. To get out of copy mode press 'q'. One useful bit of information that tmux provides is a little display in the top right corner of the active pane with two numbers. The left number shows how many lines are available to scroll down to (hidden below). The right number shows how many total lines are in the buffer.
Copy and Paste
This is something that can surprise many tmux users. You can copy and paste between panes (even of different sessions), but by default you can't copy-paste between tmux and other programs. There are several solutions for different operating systems but they are outside the scope of this article. Check out https://github.com/tmux-plugins/tmux-yank for a plugin solution.
To copy from one pane to another, first get into copy mode, then press
<space>, which will start highlighting your selection. When you're done, press
<enter>, which will put your selection in the paste buffer. Navigate to another pane and paste your selection by typing
Tmux gives you a great way to organize multiple interactive sessions logically and visually. You can have multiple long running sessions on your machine or on remote machines with multiple window in each session and multiple panes in each window. You can navigate easily between all of the above and resize the pane layout in each window to your liking. This is of course only scratching the surface. There is a lot more to tmux that I haven't covered here.