Navigating your bundled gems in Vim

Do you sometimes find yourself wanting to read the code of a method in one of the gems that your project is using? Wouldn't it be good if you could put your cursor on the method or class in question, and press a key to jump straight to the definition within the gem's source code? With the ctags program you can, and with Ivan Tkalin's guard-ctags-bundler gem your tag files will be automatically updated when you add new gems to your bundle.

Installing ctags

You'll want a recent version of ctags for use with Ruby. Check for a recent version with:

$ ctags --version

If ctags isn't found (or you get an error message because the --version switch isn't supported) you'll need to install Exuberant ctags.

On Debian or Ubuntu, try this:

$ sudo apt-get install exuberant-ctags

On the Mac I'd recommend installing it with Homebrew:

$ brew install ctags

Test it by typing ctags -R inside your project's directory. It should create a tags file that Vim can read to navigate around the classes and methods defined in your own project.

To add support for navigating around your bundled gems, we need to setup guard-ctags-bundler.

Installing guard-ctags-bundler

Add these two gems to the development group in your Gemfile:

group :development do
  gem 'guard-ctags-bundler'
  gem 'rb-readline'
end

You don't strictly need rb-readline, but Guard's prompt improves dramatically when readline support is enabled.

Run bundle, and then create your Guardfile:

$ bundle install
$ guard init ctags-bundler

You can edit the paths in your Guardfile if you like, but the default should work well with most Rails projects and gems. Run guard, and then edit your Gemfile and run bundle install in another terminal. Guard should report that it has re-generated a gems.tags file.

If you leave guard running while you're working it'll keep the tags files up to date for you.

Configure Vim

Vim will automatically read the tags file, but we'll have to tell it to read the gems.tags file too. Add this to your ~/.vimrc file:

set tags+=gems.tags

Don't store tags files in version control

Your tags files are continually updated as you edit your project, and because they're automatically generated it doesn't make any sense to check them in. If you're using git you can tell it to ignore the tags files in all your projects like this:

$ cat <<EOF >> ~/.gitignore
tags
gems.tags
EOF

Using ctags in Vim

Find a method in your project that you know is defined in one of the Gems in your bundle. Position the cursor on the method call, and press Ctrl-]. You should find yourself looking at the code in the gem where the method is defined. To jump back to where you came from press Ctrl-T (these keybindings are the same ones used for following hyperlinks in Vim's help system).

Vim's ctags support can do a lot more than that (such as opening the code in a split), and Vim's help on using ctags is excellent. Read it by typing :help 29.1 within Vim.

Useful links

Published on in Vim, Ruby