In part 1 I went over the basics of tmux and how to utilize its basic features. In this portion I’m going to dive a bit more into customizing tmux to make it easier and prettier to work with. I’ll also give some examples on how to utilize the client/server model.
Since this part is less of a tutorial and more of a tips / reference I decided a table of contents based layout would be a bit easier to use:
Note: If you have any tips, tricks or pre-made configurations you want to contribute to this post please do so in the comments and I’ll append them to this post.
Note**: You can type the commands into a live tmux session or place them in ~/.tmux.conf file which is automatically loaded when tmux is started.
Modify tmux bindings
- Rebinding the action key (Ctrl-b)
- Bind a key to switch between last active window
- Rebinding pane splitting bindings
Modify tmux looks & style
Misc tips & tricks
- Setting up your tmux environment via shell scripting
- Notify you when a window has activity
- Have tmux rename window automatically on command run
Modify tmux bindings
By default tmux has a decent default layout for hotkeys however there are a few keys that either made my fingers contort into ways they shouldn’t have or keys I simply always forgot. Luckily tmux offers a very simple syntax to rebind any key.
Rebinding the Action Key
Here is how you can rebind the Ctrl-b prefix to be something a bit easier to type. I personally use Ctrl-a similar to screen:
set-option -g prefix C-a
Note: The “-g” switch stands for global so the binding will affect every window. Alternatively the set-option command accepts arguments to specify the session and target of that particular binding if you like.
Now every subsequent command will be prefixed with Ctrl-a instead of Ctrl-b.
Binding a key for “last-window”
One of my favorite screen hotkeys is the last window hotkey which allows you to quickly switch between the current window and last window that was active. By default tmux doesn’t have a binding for this however it can easily be achieved by using the following:
bind-key C-a last-window
What this does is binds Ctrl-a to switch between the last active window. To use this binding you would hit Ctrl-a twice (since the prefix is set to Ctrl-a and the binding Ctrl-a).
Rebinding the pane splitting bindings
One of the most powerful features of tmux is the ability to natively split your windows into several panes. Unfortunately the default bindings to achieve this are simply unintuitive. As a result I’ve rebound the splitting commands to something I could remember:
unbind % # Remove default binding since we’re replacing
bind | split-window -h
bind – split-window -v
At first this may look odd but for me it’s easier to remember that “|” splits the screen vertically while “-“ splits the screen horizontally. To achieve the below window structure you would type the following sequence:
Ctrl-a |
Ctrl-a –
Ctrl-a –
The first Ctrl-a |command splits the current window in half. The active window is the pane on the right so the subsequent Ctrl-a – splits that window into two vertically. Hitting Ctrl-a – once more now splits that active window into two more by splitting it vertically.
Note: Depending on the active layout you’re using the behavior of how the windows split may be different.
Modify tmux look & style
The default colors and style of tmux isn’t awful however it’s somewhat bland for my liking. I personally only have modified tmux slightly however it allows you to do quite a bit. In this section I’ll go over some of tmux’s style features.
Modifying tab color & looks
By default the tab colors are pretty bland and it makes it difficult to distinguish the active window from the other windows. Here is the default tmux tabs vs. the modified ones (snippet below):
As you can see the latter version is much more clear and uses some variable expansions tmux provides (hostname, etc). You can achieve this output with the following:
# Set status bar
set -g status-bg black
set -g status-fg white
set -g status-left ‘#[fg=green]#H’
The first two commands set the background to black and the text to white. The third command is where the magic happens: the status-left command tells tmux to display the following text to the left of the terminal. The [fg=green]#H portion tells tmux to display the hostname of localhost and make it green. The #H portion is part of tmux variable expansion – please refer to the man pages for more information on other ones you can use.
That alone doesn’t account for highlighting the active window. If you want to do that use the following snippet:
# Highlight active window
set-window-option -g window-status-current-bg red
The set-window-option -g window-status-current-bg red command tells tmux to change the background of the current active window to red. The set-window-option command has several other options you can pass to it to achieve similar affects.
Adding information to your session
Sometimes it might be useful to add some information from your local machine to the tmux screen. Earlier we played with the status-left command which sets the left portion of the status bar. Let’s use the status-right command to add some information to the right side:
As you can see I’ve added the amount of users logged in and the current load average for my computer. This was achieved with the following snippet:
set -g status-right ‘#[fg=yellow]#(uptime | cut -d “,” -f 2-)’
Similar to before the #[fg=yellow] portion tells tmux to make the font yellow. The #(uptime | cut -d “,” -f 2-) portion tells tmux to run that cmd and output it on the right of the status bar.
Note: If you’re not familiar with shell scripting this command is very simple. It runs the uptime command and then passes it to the cut command which splits it at the commas (,). The -f 2- portion says to print out everything from the second comma onward.
Note**: By default the status bar is redrawn every 15 seconds however you can modify this by setting the status-interval command.
Misc tips & tricks
Using shell scripting to setup your tmux enviroment
Tmux allows you to easily run commands for your different sessions through the command line without having to ever login to the session. This also allows us to make a simple bootstrap script which will setup your tmux environment and log you into it. Here is an example script I personally use:
#!/bin/sh tmux new-session -d -s hawkhost tmux new-window -t hawkhost:1 -n 'Server1' 'ssh [email protected]' tmux new-window -t hawkhost:2 -n 'Server2' 'ssh [email protected]' tmux new-window -t hawkhost:3 -n 'Server3' 'ssh [email protected]' tmux new-window -t hawkhost:4 -n 'Server4' 'ssh [email protected]' tmux new-window -t hawkhost:5 -n 'Server5' 'ssh [email protected]' tmux select-window -t hawkhost:1 tmux -2 attach-session -t hawkhost
The command new-session -d -s hawkhost creates a new tmux session, detaches it (so it doesn’t open in your current terminal) and names it hawkhost in this case.
The following set of new-window commands create five new windows and executes the command at the end. The arguments are broken down as follows: -t hawkhost :1 tells tmux to “target” the session hawkhost and the window with the id of 1. The -n ‘Server1’ ‘ssh [email protected]’ portion tells tmux to name the window Server1 and execute the ssh [email protected] command in it.
The last two commands are pretty straight forward. The select-window -t hawkhost:1 command tells tmux that you want the active window the session to be hawkhost and window 1. The -2 attach-session -t hawkhost tells tmux you want to attach the terminal with 256 colors and attach to the session hawkhost.
Note: This is the command that brings the tmux session to the foreground. If you recall earlier when the script created the session we specified the -d switch which prevents it from loading in your terminal.
Notify you when a window has activity
This quick snippet will have tmux notify you in the status area when a window has activity:
# Set window notifications
setw -g monitor-activity on
set -g visual-activity on
As you can see in the first image it lets me know that there was activity in window 0 (in this case sleep 10 && echo “narwhal” and switching the window).
Automatic window rename
You can have tmux rename the window to the command that is currently running. This is useful when you load up something such as irssi and the window is labeled accordingly:
# Automatically set window title
setw -g automatic-rename
You can’t use the examples you’ve provided, because they’re using SmartQuotes.
So attempting to cut and paste what you’ve posted breaks and doesn’t work. You might want to fix it so users don’t get angry 🙂
Good catch – I despise automagic formatting for reasons such as this. I’ll see if I can modify it a bit as not to butcher my quotes :).
good post … nicely explained … thanks
Would you mind doing a write up on the vi bindings? I didn’t see that covered in part1 or 2
I’ll see what I can do :).
Not just the quotes, but the dash got changed to a “smart” hyphen in part 1. Assuming it’s probably the same in these examples as well.
Anyway, great series. I had tried tmux a while ago but ended up falling back to screen. These posts have made me decide to give it another shot. I don’t think I fully grasped the concept of panes vs. windows before. It’s quite different from screen.
Here are some “vim-ish” bindings I use:
# use "v" and "s" to do vertical/horizontal splits, like vim
bind s split-window -v
bind v split-window -h
# use the vim motion keys to move between panes
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# use vim motion keys while in copy mode
setw -g mode-keys vi
# use the vim resize keys.
# the number at the end is how much the pane will be resized,
# and 1 is fairly small -- you might want to tweak this.
bind resize-pane -R 1
bind - resize-pane -D 1
bind + resize-pane -U 1
ugh, formatting munged that last block. should be:
bind < resize-pane -L 1
bind > resize-pane -R 1
Does anyone know how to get tmux to display a message on startup, or set a particular panel configuration. I want to be able to see a list of useful keybindings (preferably in a seperate panel) when I start.
Hey Joe,
would adding another new-window line with a “cat current_keybindings.txt” command do the job?
I was wondering if it’s possible to have tmux open a new window, split the window and ssh to a different server in each pane.
I got
tmux neww “exec ssh $server”
tmux splitw -v
but i can’t get it to do a second ssh in the second pane.
Thanks in advance.
So tmux split-window -v “exec /ms/dist/aurora/bin/ssh -q $server2 worked.
Awesome, thanks for the info! I’ve been using screen for years now, and wanted to get into tmux (because it is installed by default on OpenBSD, my second favorite *nix flavor), but really haven’t had the time or inclination. Reading through your little tutorials not only got me started, they armed me up with lots of good info!
Btw, I posted links to these blog posts to my LUG Yahoo group, hope that’s ok.
Howard
Hi,
is there someone that has a problem with automatic-rename on tmux installed via homebrew on osx?
Setting stays ON even if it’s set to OFF in the tmux config file or even it’s set manual for a window.
Thanks 🙂
Is there a way to save and restore session like screen? I’m with this doubt.
Thanks
I got the answer …. C-b d to deattach and “tmux attach” to restore 🙂
Great 🙂
Thanks for the tmux rundown! One thing, tmux complains it doesn’t know what key ‘-‘ is when I try to add that binding, haven’t found a fix yet!
I have problem to switch from one window to other. I splitted window and now my active panel is on right. How to switch between both?
thanks
Suggestion: You might want to include, somewhere, a copy-pastable version of *your entire setup file*… so those who like most of your ideas can grab it, and just cut out the line or few they don’t like.
Instead of having to glue it all together.
Nice tutorial.
Is there a way to save the settings you’ve typed in in a live tmux session to the conf file?
Hey,
I seem to be having a problem where Tmux is blatantly ignoring my config file, even though it exists. Thoughts?
~Alex
@Alex Hart:
make sure you kill *all* tmux instances before you open a new tmux session to see your changes. Alternatively, just do
to reload your config file.
@Baylink: with a few modifications for my own setup.
Thank you Cody for a such an awesome post. This post single-handedly got me into tmux and I’m *loving* it!
P.S. sorry for double-post. I couldn’t edit my previous post.
Hey, it should be:
setw -g automatic-rename on
Anyone know if it’s possible to get net upload/download transfer speeds in the status line? If I could get that displayed along with Load Averages and acpi temperature, calender and uptime, I could abandon dzen2 altogether and save a few pixels of vertical space on my netbook.
Help~!!
Great write up Hawk – it’s blog posts like these that enthuse me about new stuff. I’ve switched from screen to tmux and loving it.
I loved tmux and your simple useful customizations. I use guake with only 2 -3 tabs open (1 for emacs, 1 for remote host and third for my local machine) and wanted split panes in 3rd one. tmux solved the problem!
Thnx a lot.
–kshitj
“set -g status-bg black” doesn’t seem to work when I put it in the tmux.conf
“set-option -g status-bg black” doesn’t work either.
I tried your split window bindings which both work:
bind | split-window -h
bind _ split-window -v
Any idea what is wrong? I’m using tmux from macports on OS X 10.7.1
Never mind, needed to reload the config, hadn’t learned about that yet 🙂
Would you know how to “swap” panes?
For example, let’s say I do ‘Ctrl-a |’ so I have two panes. I want to replace one of the panes with window 2.
Your post is what got me to replace tmux with screen, thank you. I have a question, whenever I listen to music with Music on Console, the tab will display the song’s title, it is long, and it takes up the entire width of my screen. I want to limit X amount of characters displayed on the tabs, what should I put in my configuration file?
What triggered my interest to tmux was its ability to send input to all panes simultaneously. Considering switchover from screen to tmux.
You may want to take a look into tmuxinator[1], if you want to start a complex session from the shell.
[1][https://github.com/aziz/tmuxinator]
To really make ^a work like it does it screen so that ^aa sends a literal ^a you really need the following:
set-option -g prefix C-a
bind-key C-a last-window
bind-key a send-key C-a
Hi ,
just started with tmux ( on freebsd 9 , i386) ,
i like that font on your statusbar quite a bit , would you mind to tell the name ?
did you apply that in Xdefaults ?
thanks ,
T
Pingback: Script to enter commands in a Tmux window
Hello,
is there a tut where i can read how to install tmux coz i get to the screen with the green bar and the [0] 0:bash* but if i press ctrl and b nothing happends thats for all ctrl functions. what m i doing wrong im using ubuntu server and im very new at this
thx
grtz gold
Thanks! Very useful stuff. This post takes tmux from sane alternative to screen to a *great* and intuitive alternative to screen.
Pingback: How to pass commands to 'screen'
Pingback: Emile "iMil" Heitor 's home » Blog Archive A new multiplexed world » Emile "iMil" Heitor 's home
I have not been able to find documentation on the -n option described. I looked here:
http://www.openbsd.org/cgi-bin/man.cgi?query=tmux§ion=1
Where did you find the docs for this option?
Hello, everybody! How are you?
I’d like to know if is it possible to start TMUX splitted (vert and horiz)? If yes, how do I do this?
Thanks!
Read both posts here. I still don’t see the point for either tmux or screen.
If I need more terminals, I’ll open another terminal. Focus follows mouse, so a tiny flip of the wrist and I’m in a new window – nothing fancy to remember. Resizing isn’t an issue. Having lots of terminals open it bonehead simple.
If I need to send the same command to 2 or 50 different systems, there is clusterssh or ansible. Using less cssh and more ansible these days.
So – why bother?
I’ve only been an admin for 15 yrs – what am I missing?
Why use tmux or screen as opposed to opening additional terminals? I can think of several.
1. I can easily connect to my pre-existing screen/tmux sessions remotely. Does, if I have to reboot my desktop and my screen session is running on a remote system, I can ssh once to the remote system do a screen -Dr or tmux attach -d and I now have all of my existing connections back.
2. Its terminal independent. If I use a terminal with support for tabs, I can have a bunch of sessions open in the same window… but if I have to use a system that doesn’t have that terminal, I am out of luck. Even if I have to use Windows to ssh into my machines, I can start screen or tmux and have a tabbed terminal.
3. Works even on systems that don’t support X. Again, if I have to connect remotely, say from a windows box without X installed, I can’t just type xterm to get a new terminal. But screen or tmux allow me those advantages.
If you want notification from shell commands within tmux there’s display-message. E.g.
make && tmux display-message “compile done”
Do you mind iff I quote a few of your posts as long as I provide credit and
sources back to your webpage? My website is in the exact same area of interest as yours and my visitors would genuinely benefit from
some of the information you present here.
Please let mme know if this okay with you. Regards!
While this is a rather old article, it would be nice if you updated the style section. It took me a bit of searching around to figure out why the commands were not working right.
For example the following style option is currently outdated and will result in an `invalid option:` error.
`set-window-option -g window-status-current-bg red`
Should be changed to:
`set-option -g window-status-current-style bg=red`
See: https://github.com/tmux/tmux/wiki/FAQ#how-do-i-translate–fg–bg-and–attr-options-into–style-options