loading...

Pair Programing with vi and tmux

casonadams profile image Cason Adams ・2 min read

Working remotely is really the only way to do things moving forward. However, it is more difficult to pair program when you are not sitting side by side at the office. There are some nice tools out there that make this remote pair programing easier. But they are GUIs and slow and I want speed! So here is what I have done to pair program effectively.

Requirements

  1. tmux
  2. vi or terminal based editor
  3. ssh enabled box

Setup

First only pair program with those you trust to be on your machine.

Add users to ~/.ssh/authorized_keys

command="tmux attach -t pair -r" public_ssh_key1
command="tmux attach -t pair -r" public_ssh_key2
command="tmux attach -t pair -r" public_ssh_key3

Add tmux read only toggle to ~/.tmux.conf

bind-key R switch-client -r

Port forward port 22

Since we are going to use vanilla ssh to pair program we need to port forward port 22 to the machine you are going to pair on.

In my case I setup a dynamic DNS using duckdns

sshd_config

We need to tell sshd to use ssh keys instead of passwords
Add or update the following in /etc/sshd_config

PasswordAuthentication no
ChallengeResponseAuthentication no

Setup tmux pair session

Now that things are ready to go we made it so connections can only connect to tmux sessions labeled pair.

This requires that tmux new -t pair be created before anyone can connect.

So host computer will setup the tmux new -t pair and the client(s) would then ssh user@ddns.org Once a peer has connected they connect in readonly mode. To toggle edit mode just ctrl+b R. And again to go back to readonly mode.

There are many different ways to set this up and get running but this is the basic idea. I have been pair programming with way for quite some time and it is very fast and low latency.

Exit the session as a client with ctrl+b d. If the host closes the session all peers will be disconnected.

Closing notes

With tmux 3.2 or greater you can setup multipane edits. As an example one can split panes ctrl+b % and when a peer connects the host can work in the pane on the left and the peer can work in the pane on the right etc.

Simply modify the command in the ~/.ssh/authorized_keys file to look like this.

~/.ssh/authorized_keys

command="tmux attach -t pair -r -factive-pane" public_ssh_key1
command="tmux attach -t pair -r -factive-pane" public_ssh_key2
command="tmux attach -t pair -r -factive-pane" public_ssh_key3

When using this mode make sure each host and peers are using the same terminal size or the screen might bounce as users interact with it.

Posted on by:

Discussion

pic
Editor guide
 

Interesting. I had good experience remote pairing using Live share on vscode.

 

It isn't that it is a bad experience. Teletype for Atom (uses webRTC) is pretty slick too. It is that my preferred editor is vi. There are other solutions like tmate also. This example is more or less a way to do it. And my preferred method.

 

True. It's good know of other ways to do it πŸ™‡

 

I was wondering if you were going to mention the ForceCommand directive in sshd_config, but then I saw how you did it via authorized_keys. I had no idea you could do that! Very nice.