Navigating Vim

Sun, Feb 13, 2011

The traditional way for moving around in Vim is the h,j,k,l keys. The reasoning
is that it keeps your hands on the home row of the keyboard without having to move away to the
arrow keys. The problem with this is that its just too much of a cognitive shift from traditional
arrow key based editing. I think more important is learning to navigate beyond simple up/down/left/right.

W, B - jump forward/backward by word

/(term) - search DOWN for term

?(term) - search UP for term

gg - top of file

G - bottom of file

(n)G - goto line n

m x - mark current position as ‘x’ (or any other letter)

`x - jump to marked position ‘x’

% - jump to closest/matching parenthesis [], (), {}

Even more useful than navigating by search is to be able to follow tags. Depending on the language
you are editing in, you may be able to setup an exuberant tags ctags file and use <C-]> to jump
to the definition of the method currently under the cursor.

From the command line:

sudo apt-get install ctags
cd /path/to/my/project
ctags -R

Now from within vim in that same directory, if your cursor is over a call to method foo and you
enter command <C-]> then vim will jump to the definition for method foo.

Navigating across files

As programmers, our code is modularized and spread out amongst many files within our project
structure. So, not only do we need to figure out how to navigate within a single file, we must
also become efficient at finding and opening other files relevant to our task in hand. There are
many plugins to make file management easier, and we will look at the most useful in a future post,
but for now its best to start with the Vim basics so you can appreciate what the plugins are
managing when you look into them later.

Vim maintains multiple buffers in memory for each open file. You can edit a new file from
within vim:

:e [FILENAME]

If your existing buffer has unsaved changes you will not be allowed to open a 2nd buffer. You can
override this behavior by setting the hidden option:

:set hidden

Once you have multiple buffers open you need to be able to switch between them. To see open buffers
use the :ls or :buffer command. You will see a list of open buffers along with a buffer number
as the first column. To view one of these buffers use the :buffer N command.

If you are anything like me you will find this very annoying. Luckily, thanks to various plugins
(that I will show you in a future post) buffer management can be made a lot easier.