Terminal pair programming without raster graphics.
Desktop sharing is for windows devs!
Tmux!? Who wants to set that all up (not me).
A sister project to /dev/pty/vim
Yo dawg, anyone want to pair with me on my pair programming program?
- Only the server runs the application (or even needs it installed for that matter).
- VIM will be used for example purposes in the rest of this document, but any program can be used
- Everyone who wishes to be part of the paring session connects to the server.
- This is a very similar technique to what GNU Screen or TMux do.
- The server's VIM is loaded into a pseudoterminal that is controlled by the server
- Client keystrokes are sent to the server
- The server then passes those on to the captive VIM
- STDOUT from the pseudoterminal is forwarded to the server and the broadcast to cleints
- Clients have their display updated to match the forwareded STDOUT
ctrl-z
allows clients to disconnect.
Requires Ruby 2.0.0 or better.
gem install dev-pty-screen
or:
# clone this repository
git clone https://github.com/dapplebeforedawn/dev-pty-screen
# build the gem
cd dev-pty-screen
rake build
# install the gem
rake install
- On the computer hosting the code to work on.
cd /a/directory/with/some/code
dev-pty-server "vim"
- On each client
dev-pty-client
- Quitting: ^Z (ctrl+z) prompts your client to quit. All other keys are forwarded to the server.
- Any terminal program can be used (say, the Guard your probably running with your vim)
dev-pty-server "tail -f log/development.log"
- On the client, for a quick log sharing session:
dev-pty-client
- With non-interactive programs, like tail, the clients screen will refresh when the server has new data.
Since the terminal output from the server is shared with the clients directly, the number of rows/columns on the screen is set by the server. When starting dev-pty-server, rows/columns are defaulted to the size of the terminal window housing the server. This can be changed by using the --rows
and --columns
options.
This approach has a few draw-backs compared to the run-your-own-VIM tact that /dev/pty/vim uses (and a few advantages)
- Since there's only one copy of the files and one running VIM, it's impossible for the buffers or files on disk to be out of sync
- When a commit is made using a VIM plugin, like fugitive, only the repository running the server, and it's user make the commit (as opposed to two users making the same commit in two repos)
- The clients can only interact with the server, but not each other. This means in an untrusted pairing session, you could run the server on a temporary ec2, and invite strangers to pair without giving them access to your private network.
- A hell of a lot less setup than /dev/pty/vim
- As with /dev/pty/vim all clients need to share a common .vimrc (and plugins). Here it's inforced by there only being on copy of VIM running, as opposed to a pre-connect .vimrc handshake.
- Since the clients are dumb terminals, and they may have different screen sizes, some clients may not get a full screen experience. Screen size is controlled by the server, and forced upon the clients.
- When a client initially connects they need to press key to get STDOUT to re-paint. Telling VIM to create a new tab (
:tabnew
) is a simple work around for now. - Notifications about who is typing
- Custom .vimrcs that are applied when a client is typing
- Replace all the
Thread.new
calls with a celluloid actor - Seriously, why are arrow keys so hard to work with !?
├── bin
│ ├── dev-pty-client # Run this to start a client
│ └── dev-pty-server # Run this to start a server
├── lib
│ ├── client
│ │ ├── app.rb
│ │ └── options.rb # Options parser for the client
│ └── server
│ ├── app.rb
│ ├── key_server.rb # Listens for keys strokes from clients
│ ├── options.rb # Options parser for the server
│ ├── pty_server.rb # Manages the screen/key servers and the application_interface
│ ├── screen_server.rb # Pushes STDOUT updates to clients
│ └── application_interface.rb # Sends keystrokes to the captive VIM
|
├── spec
├── client
└── server
├── key_server_spec.rb
├── pty_server_spec.rb
└── screen_server_spec.rb
rspec
- File a bug here
- Contact me on twitter/email : @soodesune/[email protected]