24 July 2014

vim + tmux: A Perfect Match

tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached.

[tmux manpage][]

When I first heard of tmux I just assumed it was a beefed up version of screen. I had used screen many years ago in order to keep an IRC client logged in even if I was not connected to my shell. At the time I didn’t see much benefit in adding a tool like this to my development environment.

For a long time I heard developers singing the praise of vim and tmux. Hearing about the release of iTerm2 2.0 and it’s integration with tmux sparked my interest in tmux and vim once again. I still don’t know exactly how iTerm2 and tmux integrate, but I’m really happy with my workflow with vim and tmux.

I have been using vim+tmux together for a couple of weeks now and there’s no looking back. If you’re willing to invest a little bit of time to set things up, you’ll quickly make up the time with your streamlined workflow.

Prerequisites

brew install tmux
brew install macvim --override-system-vim

Download and install iTerm2 (optional)

Out of the Box

Below are some of the most basic commands for interacting with tmux.

Create a session

The first thing you’ll want to do after installing tmux is create a session.

$ tmux new -s gaslight-blog

Detach session

You can detach from the session at any point by pressing:

Ctrl-b d

Attach session

You can attach to the session from the command line with:

$ tmux attach -t gaslight-blog

Split horizontally

You no longer have to be dependent on your terminal application to create split panes.

Ctrl-b %

Split vertically

Ctrl-b "

Pane Navigation

</tr>
Keybinding Action
Ctrl-b ↑Up
Ctrl-b ↓Down
Ctrl-b ←Left
Ctrl-b →Right

tmux.conf

I ran into numerous issues when starting out with vim, tmux, iterm2, and mac os. My tmux.conf is pretty slim and well documented at the moment and I recommend you check it out.

vim workflow

The main reason that I continue to use tmux is the great integration that can be achieved with vim+tmux. Prior to using tmux I used MacVim, but if you’re going to use vim and tmux together you’ll need to use terminal vim.

vim-tmux-navigator

Perhaps my favorite feature about using vim and tmux together is vim-tmux-navigator. This plugin allows you to treat vim and tmux as one a unified session, with the ability to seamlessly navigate between vim splits and tmux panes.

</thead> </tr> </table> This assumes you're already navigating your vim splits like a sane person using these bindings by adding this setting to your .vimrc: ``` nnoremap j nnoremap k nnoremap h nnoremap l ``` ### rspec.vim + tslime.vim One thing that I missed when I was transitioning from emacs to vim was rspec-mode. I quickly discovered [rspec.vim](https://github.com/thoughtbot/vim-rspec) which allows you to run specs from within your editor. I didn't spend too much time working with rspec.vim before I was frustrated by the default behavior which blocks the entire vim process. This is no fault of rspec.vim, rather it is more of an issue with vim. Thankfully rspec.vim has a lot of flexibility for generating custom commands and you can easily integrate with [Dispatch](https://github.com/tpope/vim-dispatch) or [tslime.vim](https://github.com/jgdavey/tslime.vim). I am currently using tslime.vim using the instructions [here](https://robots.thoughtbot.com/running-specs-from-vim-sent-to-tmux-via-tslime) and it seems to be working well. ### vim-like copy and paste I am still learning the ins and outs of copy and paste while using vim and tmux together. If you're willing to give up using the mouse for selection [this article](https://robots.thoughtbot.com/tmux-copy-paste-on-os-x-a-better-future) provides instructions on getting copy and paste setup very similar to vim. ### colors When I first started vim inside of tmux the colors were not correct. After searching I found that I needed to add this to my tmux.conf: ``` set -g default-terminal "screen-256color" ``` I also had to make sure that iTerm2 was reporting the terminal type as `xterm-256color`. ## References This article was made possible with the help of many other articles: [https://blog.sanctum.geek.nz/reloading-tmux-config/](https://blog.sanctum.geek.nz/reloading-tmux-config/) [https://wiki.archlinux.org/index.php/tmux](https://wiki.archlinux.org/index.php/tmux) [https://robots.thoughtbot.com/a-tmux-crash-course](https://robots.thoughtbot.com/a-tmux-crash-course) [https://coderwall.com/p/j9wnfw](https://coderwall.com/p/j9wnfw) [https://robots.thoughtbot.com/tmux-copy-paste-on-os-x-a-better-future](https://robots.thoughtbot.com/tmux-copy-paste-on-os-x-a-better-future) [https://www.dayid.org/os/notes/tm.html](https://www.dayid.org/os/notes/tm.html) [https://github.com/altercation/solarized/issues/159#issuecomment-5566892](https://github.com/altercation/solarized/issues/159#issuecomment-5566892) [https://stackoverflow.com/questions/10158508/lose-vim-colorscheme-in-tmux-mode](https://stackoverflow.com/questions/10158508/lose-vim-colorscheme-in-tmux-mode) [tmux manpage]:https://manpages.ubuntu.com/manpages/precise/en/man1/tmux.1.html
Keybinding Action
Ctrl-lright
Ctrl-kup
Ctrl-jdown
Ctrl-hleft
Heads up! This article may make reference to the Gaslight team—that's still us! We go by Launch Scout now, this article was just written before we re-introduced ourselves. Find out more here.

Related Posts

Want to learn more about the work we do?

Explore our work

Ready to start your software journey with us?

Contact Us