ReefPointsBlog

Tmux, for fun and profit

Dan McClain

Screen - the gateway drug

I had been using screen for a while to multiplex my terminal when working on Ruby projects. I would have a tab for git (was using MacVim), on for rails s or tail log/development.log, one for running tests (now using guard or autotest), one for rails c and lastly one for rails db. Detaching from a screen session allowed me to have a full environment running until my next reboot, I could switch back into the project quickly, and I had configured my .screenrc to open these tabs everytime I started screen.

I also utilized screen to keep sessions open on a remote server between SSH connects. Instantiating a screen session on the remote server would keep processes running even when my SSH connection would get killed. This would prevent an apt-get upgrade from fragging the system incase I disconnected, or allow me to drop the connection during a long running process.

As much as I used it, I was still a screen newb, as my .screenrc was pretty vanilla. I hadn't taken the time to read the man pages/tutorials out there to understand some of the more subtle features.

Tmux and Brian P. Hogan's 'tmux' book

I had noticed that tmux was getting a decent amount of attention, so when I started at DockYard, I told myself I would only use tmux. I also switched from MacVim to terminal vim, which works better when pair programming. Brian P. Hogan recently wrote tmux: Productive Mouse-Free Development for Pragmatic Programmers. After reading his book, I have a solid .tmux.conf and a great understanding of tmux.

Tmux and Pair Programming

The one disadvantage of everyone at DockYard working remotely is that you can't just turn around and ask someone to come to your desk to pair up. Tmux allows multiple users to connect to a specific session. With a bit of dynamic DNS magic, port forwarding, and ssh tunneling, multiple people can connect to the same tmux session, work in the same vim window, and see the same development server.

The first step is dynamic DNS and port forwarding, which I won't cover here, since everyone has different modems and routers. You want to forward port 22 through your router/firewall to your development machine. Using dynamic DNS, you can connect to your coworkers via a domain like dan.example.com instead of figuring out your IP and sending that to your partner.

We use the following ssh command to forward connection on our local machine to the other person's

1
ssh dan.example.com -L 3000:127.0.0.1:3000

The above command forwards any request on port 3000 on my machine the one to which I am connected. That way, I can see what my partner sees when we edit files on his machine. Once connected, I just attach to my partner's tmux session. At this point, we are programming in the same terminal session, and we can both see the edits as we make them. We use a Google+ Hangout to communicate while we pair program.

Conclusion

With a tmux, ssh port forwarding, and Google+ Hangout, you can create a useful pair programming environment with your remote coworkers. We find this setup very effective and use it often to work together and tackle an issue.