Using Tmux for everything

04 May 2014

I use Tmux for all terminal work/play sessions. Generally, I just run
tmux for every time I want to hack on something unrelated to the
sessions I already have. That command will create a new unnamed tmux
session which, while useful, that gets quickly unwieldy if you keep
doing that often. Wouldn’t it be wonderful if there was a way to start a
scratch session whenever I open a new terminal window? Turns out, it’s
not that complicated.

After fiddling with a simple shell script, I now have a functional
setting where a tmux session named scratch gets connected to whenever
a new terminal tab/window is created. To do this, start by create a file
called ~/.zprofile — if it already exits, append the code to that file
— and drop the following code in it. The reason to add this to that
specific file is that the profile config file gets run every time a shell
login happens. We would want to start a tmux session right after
logging in to the
shell.

First, we check if there’s a session named scratch, we simply attach
to it while detaching all the existing client connections running the
same session. This way, we always will have just one window running the
scratch session. -d is passed in for this purpose. The tmux has
or tmux has-session in it’s long form is used to check if there’s a
session already present. This command exits with an exit code of 0 if
there is a session or with a code of 1 if there is no such session.

If there’s no session named scratch, we create a session and
immediately detach from it by passing the option -d.

We then check if a Tmux session is already running. The [ -z "$TMUX" ]
condition will check if the string $TMUX is blank. -z option checks
returns true if the string is blank. So, we attach to a session only if
it’s not inside a tmux session already. The only thing adding
that check did was disable a warning that gets shown when tmux sessions
gets nested. This doesn’t happen usually, by the way; this command run
only once at login and is unique to each session. But I had to add that
check to stop the complaints.

Although this code is pretty simple, since Tmux supports a good level of
programmability, more configurations can be achieved. For example, I can
add a command that opens two windows, one with pry and another with just
the command prompt. Here’s a link I found helpful for creating such
sessions.

Kashyap Kondamudi
Ex-banker. Rubyist. Typography buff. I draw ambigrams during meetings. Currently working at Codemancers