---
title: Integrating Vim Into Your Life
teaser:
tags: vim,unix
author: Mike Burns
published_on: 2009-04-08
---

More tips from thoughtbot about using vim, but this time with an emphasis on
fitting it into your life.

## Copy and paste

To copy and paste from your PRIMARY (on OS X, your clipboard) you use the `*`
register. For example, to paste from something you've copied elsewhere use
`"*p` and to copy the current line into your system-wide buffer use `"*yy` .

For those of us with both a PRIMARY and a CLIPBOARD, the `*` register is the
PRIMARY and the `+` register is the CLIPBOARD.

## Reducing distractions

You can fullscreen MacVim to block out other distractions with `:set
fuoptions=maxvert,maxhorz` and then `:set fullscreen`. You can get back with
`:set nofullscreen`

## File management

Converts from IDEs such as Visual Studio like Nick might miss a file explorer
for your project. Luckily,
[NERDTree](http://www.vim.org/scripts/script.php?script_id=1658) comes to the
rescue. Packed with plenty of good shortcuts, this helpful plugin saves Nick a
lot of time when a simple `:e` or using the `:R` macros in
[rails.vim](http://rails.vim.tpope.net/) just won't cut it.

## Search results from the command line

While Jason blogged about integrating Ack into vim before, here's a handy shell
script to open a new vim with search results from the command line.

    editor=${VISUAL:-vim}
    if [ "$#" = "1" ]; then
      $editor -c "/$1" $(grep -l $1 **/*)
    elif [ "$#" = "2" ]; then
      $editor -c "/$1" $(grep -l $1 $2)
    else
      $editor $(grep -l $@)
    fi

Save that as `vg` then, to open all files that mention `current_user` from the
command line run: `vg current_user`

## The full blame

You see that weird piece of code? Who checked that in?! Why is it even there?!

Add these to your `.vimrc` to get the quick blame for any highlighted lines
(`\b` for svn, `\g` for git, and `\h` for Mercurial):

```vim
vmap <Leader>b :<C-U>!svn blame <C-R>=expand("%:p") <CR> \
| sed -n <C-R>=line("'<") <CR>,<C-R>=line("'>") <CR>p <CR>
vmap <Leader>g :<C-U>!git blame <C-R>=expand("%:p") <CR> \
| sed -n <C-R>=line("'<") <CR>,<C-R>=line("'>") <CR>p <CR>
vmap <Leader>h :<C-U>!hg blame -fu <C-R>=expand("%:p") <CR> \
| sed -n <C-R>=line("'<") <CR>,<C-R>=line("'>") <CR>p <CR>
```

## ctags

[Exuberant ctags](http://ctags.sourceforge.net/) is a program that scans source
files for keywords and supports many languages, including Ruby.  Jumping to a
defined tag is much faster and easier than searching for it in your project
using Ack or Grep, and Vim integrates with ctags nicely.

You can create a tags file using the `ctags` command (run `ctags --help` for
options), but if you're using the excellent
[rails.vim](http://rails.vim.tpope.net/) plugin by Tim Pope, you can run the
`:Rtags` command from Vim. Running this command only takes a moment, and will
generate a tags file containing all the keywords and locations in your project.
Note that you'll have to regenerate your tags file using the same command for it
to pick up new keywords.

Once you have a tags file, you can jump to a tag by using the `:tag` command:

    :tag ensure_user_is_admin

Or by pressing `Ctrl+]` when the cursor is over a keyword. If there is more
than one match for a tag, you can use `:tn` (next tag), `:tp` (previous tag),
and `:ts` (select from a list) to navigate through matches. Again, this is much
faster than searching.

Another benefit of using ctags is that you can use it for tab completion. I
find that tab completion becomes unusably slow in a large project if you're
finding keywords from open buffers, but you can tell Vim to only use the
current file and ctags when finding keywords:

    :set complete=.,t

Completion results with this setting are instantaneous.

Contributions by Jon Yurek, Nick Quaranto, and Joe Ferris.
