Vim and Tmux are an excellent choice for a modern develpment environment on Mountain Lion. I describe how to combine create such an environment using homebrew.
Using a rad, aesthetically pleasing, and efficient development environment is so crucial to having a good day. I’m going to describe mine, and give you the set of links from which I’ve assembled this confection. We’ll be using:
Vim & MacVim
First, one must install MacVim. Duh. With homebrew. Duher.
$ brew install macvim
Now we’ve got MacVim, which is a gui flavored Vim. It’s wildly useful, and a bit more comfortable for those of us accustomed to cmd-tab’ing through our applications. Still, we’ll want Vim.
The Vim that comes stock with OSX sucks all sorts of members. Welp, there’s a better way. Install Vim with homebrew. As it’s a dupe of a stock OSX application, we need to tap homebrew/dupes, and install from there.
Installing Vim from hombrew/dupes can be sort of tricky, though. I wasted about an hour, smashing my face into something solid, unable to understand why homebrew was exploding while trying to compile Vim. I’m still not sure what was happening, but I know how I fixed it.
I manually changed what version of Vim is fetched from Google’s code repo. You should too, until that shit is fixed.
$ brew tap homebrew/dupes $ vim /usr/local/Library/Taps/homebrew-dupes/vim.rb # At the very top, replace url url 'https://vim.googlecode.com/hg/', :tag => 'v7-3-617' $ brew install homebrew/dupes/vim
I still bounce back and forth from MacVim to Vim, though I’m getting more in the habit of sticking to Vim. MacVim is tops, though.
Now, as anyone who’s ever opened Vim can tell you, it’s terrible until you add some plugins to it. A tedious affair. Made less tedious by something called Pathogen. Made lesser tediouser by a plugin manager called Janus. Let’s go with Janus.
$ curl -Lo- https://bit.ly/janus-bootstrap | bash
Janus is extremely easy to extend with additional plugins by using Pathogen. We can create a directory called ~/.janus, into which we can install all sorts of code loot.
$ mkdir ~/.janus $ cd ~/.janus
Now, let’s start downloading!
tComment - nice shortcut for commenting things
$ git clone https://github.com/tomtom/tcomment_vim
Powerline - looks pretty
$ git clone https://github.com/Lokaltog/vim-powerline
Solarized Theme - looks pretty
$ git clone https://github.com/altercation/vim-colors-solarized
Eunuch - use things like “:SudoWrite”
$ git clone https://github.com/tpope/vim-eunuch
Chool. Next up, let’s personalize Vim a bit, using Janus’s vimrc scheme. If you’re not familar with how Vim stores it’s setting, they’re traditionally in a file called ~/.vimrc. Janus does it a bit different, using a .vimrc.before, and a .vimrc.after. They both live in your home directory. The reason they remain separated is so that one can override Janus, before AND after.
$ vim .vimrc.before “ Add this line, because tComment is better call janus#disable_plugin('nerdcommenter') $ vim .vimrc.after “ Copy in a .vimrc boiler plate
Also, we’ll need to install a patched font so that Powerline will function properly. Powerline draws fancy characters in the status bar of Vim. This one is my favorite —> https://gist.github.com/1627888
Now, we can do all sorts of fanciful things. I recommend dropping OSX’s terminal emulator for iTerm2. It handles some stuff just a little bit better. Download it here.
Once we’re iTerm2-ing it, create a new profile for yourself at Preferences > profiles. Next, download Solarized for iTerm2 here. Once that’s done, we can load a theme into iTerm2’s color presets. Navigate to the “Colors” tab, and expand “Load a preset”. You can import your preferred flavor of Solarized. Once it’s imported, set it using “Load a preset”.
Navigate to Preferences > Text, and change your font to whichever patched font you’ve settled on for Powerline. Then, uncheck “Draw bold text in bold font”. Double check that your terminal type is set to “xterm-256color” in Preferences > Terminal. Finally, in Preferences > Keys, set the left option key to +Esc.
$ curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
Now, we’ve got a nice copy of zsh, prefab’d with a bunch of cool plugins.
Zsh is easily customized with a ~/.zshrc. As always, when working with homebrew packages, we’ll need to make sure they’re first in our path. Easily done by adding the following to .zshrc:
# $PATH # This puts homebrew packages first in path PATH=/usr/local/bin:/usr/local/sbin:$PATH
The cherry on top; Install Tmux.
$ brew install tmux
Copy/Paste can get weird, so we’ll use homebrew again:
$ brew install reattach-to-user-namespace
Add the following to ~/.tmux.conf
# zsh is kinda tight set-option -g default-shell $SHELL # copy and paster set-option -g default-command "reattach-to-user-namespace -l zsh" # look good set -g default-terminal "screen-256color" # act like GNU screen unbind C-b set -g prefix C-a # a mouse set -g mode-mouse on setw -g mouse-select-window on setw -g mouse-select-pane on # act like vim setw -g mode-keys vi bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R bind-key -r C-h select-window -t :- bind-key -r C-l select-window -t :+ unbind [ bind ` copy-mode unbind p bind p paste-buffer bind -t vi-copy v begin-selection bind -t vi-copy y copy-selection # after copying to a tmux buffer, hit y again to copy to clipboard bind y run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
A great article about setting up the “Text Triumvrate” can be had at drbunsen.org. I highly recommend reading it.
Syncing it all with Dropbox
Now, we’ve spent a bit of time creating all of these configuration files. Wouldn’t it be nice if we never have to do that again? Yes. Use Dropbox.
We can symlink every configuration file from Dropbox, stashed in a hidden folder. Move all that junk, and begin symlinking it to your home directory.
$ ln -s ~/Dropbox/.dotfiles/.vimrc.after
We can even put things like .ssh keys in there, and never fear that we’ll lose something. Only that Dropbox will go bad, like Facebook, and try to ssh into all of our shit, the better to be able to direct market to the masses.
I can’t wait ‘till Facebook dies.