3 Comments

Atomic Vim

Over the last couple of years, most of us here have settled on a shared base vim config. I originally assembled this config after leaving vim for TextMate for a while, only to return wanting the best of both worlds. This isn’t exactly an original endeavor, but the result is a little different from other vim setups.

Atomic Vim has a few ideas that (not entirely consistently) direct its approach:

  • graceful degradation across vim versions/capabilities
  • easy to set up dependencies (primary features depend only on ruby and ctags)
  • fully functional in a terminal – I don’t want to feel hamstrung over SSH
  • project/directory oriented – like TextMate
  • customizable on a project-by-project basis – particularly files indexed for fuzzy navigation and directories ignored from navigation and search
  • tries not to override existing vim shortcuts (at least, moreso than our previous shared vim config; surround.vim is included and is a notable exception)
  • tries not to add shortcuts for things that can be done just as easily with standard vim shortcuts (<leader>v for vsplit is an exception, but I normally use <C-w>v out of habit)

To use:

Clone into ~/.vim and add source ~/.vim/common-vimrc.vim to your .vimrc. brew install ctags to get exuberant ctags. I’ve mainly used the config under cygwin on windows, but gvim works pretty well (I’ve never tried setting up ctags and ruby for use in gvim on windows).

Project settings

If your working directory contains a .vim file, this is sourced automatically. We mainly use this file to add directories to g:vim_ignore causing them to be ignored in search and file navigation shortcuts.

Navigation

Uses fuzzyfinder for file completion. Out of the box fuzzyfinder doesn’t offer textmate-style navigation. It does offer a mode to fuzzily match filenames in your tags file however. Since having an up to date tags file has other benefits, we opted to post-process the tags file and add fake entries for files of interest in which ctags didn’t find anything to tag.

<leader>t shows files in your tags file, <leader>T shows tagged symbols, and <leader><C-t> regenerates your tags file and updates the fake entries (requires ctags and ruby).

<leader>e fuzzily finds files and directories in your current directory – a convenient alternative to <leader>t if you don’t have ctags available. <leader>l fuzzily finds lines in your buffer, a faster way to navigate within a file than searching. <leader>, fuzzily finds open buffers.

Any file with an extension in g:taggable_extensions is guaranteed to get a tags file entry, though any file in one of the g:vim_ignore directories will be pruned. This tweak to standard ctags behavior makes all the difference.

Search

Ack.vim is included. <leader>f searches your working directory, <leader>F does so ignoring case. The command that’s used is a customized ack command which ignores directories listed in your g:vim_ignore list.

Running files

<leader>r runs the current file. There’s a simple ruby script which dispatches on extension to run the file.

<leader>R runs the current file at the current line. This is basically just used for specs and features.

It’s pretty easy to extend the ruby scripts, but this is an area that can use improvement.

Bclose

<leader>w closes the current buffer without touching your window configuration. <leader>W does so regardless of modified state.

<leader>q is easier to type than :bd and <leader>Q easier than :bd!

Gundo

<leader>u shows a graph of your buffer’s history (if you have vim >7.3 and python support)

Clipboard Integration

<leader>c as a prefix causes the next command to use the system clipboard instead of vim’s internal register. <leader>cp pastes from your clipboard and <leader>cy yanks to it. This is mainly for terminal use in vim versions prior to 7.3.

Plugins

  • abolish – use :S to replace as you would :s but it handles case variations for you automatically (and more).
  • fugitive – awesome git support
  • surround – modify things like quotes and parens
  • align – align code easily, such as forcing all equal signs in a series of assignments to be in a column
  • snipmate – TextMate-like snippets.
  • conqueterm – embed a terminal in vim (thanks janus)

Sharable

To make it easy for each of us to customize the configuration and port our config between machines, we’ve each tweaked a few things in files like colthorp-vimrc.vim which we source after common-vimrc.vim.