There are different ways to navigate through files, or through a single file, using vim. In this note I describe a few of them, and will update it as I remember different ones. I often use the word "view" here to describe the lines being shown in any open file (which is known as a buffer in vim, and in other editors too).
What I usually do to get a sense of the file I have opened is to scroll through it, not minding (or having less control) of where the cursor will drop. For this I use ^d and ^u (that's ctrl+d and ctrl+u). This moves the cursor half a page down or upwards, and moves the view if the file is larger than the view.
In the case I know what am I looking for exactly, I think a quick search is
fast enough. For example, looking for the main function in a go file with
/func main. From there, to go back to where I was before there's ^o. ^o and
^i moves the cursor backwards and forwards the jump list.
The "jumplist" is a list of cursor positions, and a new position is added to that list after a cursor movement (but not any movement, like j or k won't add a new position to that list for example). I usually use this after a search.
This is probably a bit advance, but really useful once you get the hang of it.
Vim can bookmark lines in a file by using "marks". After creating a mark you
can navigate in the same file to another location and simply jump back to the
mark, not minding where you are or what's in the jumplist. Say I'm going
back-and-forth between my main function and some other one declaration. I can
bookmark the line where I declare the main function with
mf, and then
continue to add things to this same file in some other place, and quickly jump
back to my main function with
mf creates a new mark called
f in the
line where my cursor is, I can use any letter within this range [a-z]. Numbers
are reserved, and uppercase letters are "global" marks.
The marks I explained are local, meaning are only available in the current
file. I can close the file without issues, and the marks will remain there; and
also I can create marks in another file using the same letter. "Global" marks
exists too, these are available everywhere, but two files can't have the same
letter. For example, I want to keep my vimrc file close for changing settings;
what I did was going to the file and pressing
mV. Now I have my vimrc
available by pressing
'V from any file, I can teak something there and reload
the configs by running
:source %, or source this file), and
go back to the file I was working on with
There's another way which I used for a long time: relative numbers. I stopped
using these because it was the only mean of movement that I knew in vim, but it
was enough anyway. Try opening a file with more than 10 lines at least, and run
:set nu rnu. Now move a few lines up and down with
jk, that should give you
a hint of what relative number is. If you can view the line, you can jump
directly to it by pressing
[number][direction]. For example, there's a
function that is 12 lines up from where my cursor is, I know that is 12 lines
exactly because relative numbers tells me that, and by simply pressing
These are really useful: if I want change something close to the bottom of the
view (no the end of the file, but the lines in the screen) I can press
normal mode and navigate from there.
L is for Last line, then there's
the Hfirst line and
M for Middle line.
Those actions go nicely with some
z commands, like
zz to center the cursor
by moving the view,
zb to move the cursor to the bottom,
zt to the top.
I don't have a specific workflow with these movement actions that I described. I just know them, and use them when I feel like it. Don't know how else to explain it...