Professional Documents
Culture Documents
This tutorial assumes a basic knowledge of vim -- insert mode, command mode, loading
and saving files, etc. It is intended to help vi novices develop their skills so that they can
use vi efficiently. In this tutorial, <C-X> means Ctrl-X -- that is, hold down the Ctrl key
and press X. You can get help on most of the commands used here by typing :help
command in vim, where command is what you need help on.
Moving efficiently
Stay out of insert mode
In general, you want to spend as little of your time in vim's insert mode as possible,
because in that mode it acts like a dumb editor. This is why most vim novices spend so
much time in insert mode -- it makes vim easy to use. But vim's real power lies in
command mode! You'll find that the better you know vim, the less time you will spend in
insert mode.
Use h, j, k, and l
The first step to efficient editing in vim is to wean yourself from the arrow keys. One of
the the advantages of vim's modal design is that you do not need to constantly move
your hands back and forth between the arrow keys and the letter keys; when you are in
command mode, the letters h, j, k and l correspond to the directions left, down, up,
and right, respectively. It takes some practice to get used to, but you will notice the
speed difference once you're used to it.
When you are editing e-mail or other paragraph-formatted text, you might notice that
the direction keys skip more lines than you expect. This is because your paragraphs
appear as one long line to vim. Type g before h, j, k or l to move by screen lines
instead of virtual lines.
Most editors have only simple commands for moving the cursor (left, up, right, down, to
beginning/end of line, etc). vim has very advanced commands for moving the cursor;
these commands are referred to as motions. When the cursor moves from one point in
the text to another, the text between the points (and including the points themselves) is
considered to be "moved over." (This will be important later.)
fx Move the cursor forward to the next occurance of the character x on the current line (obviously, x
can be any character you like). This is an extremely useful command. You can type ; to repeat the
last f command you gave.
tx Same as above, but moves the cursor to right before the character, not all the way to it. (It's very
useful, really.)
Fx Move the cursor backward to the next occurance of the character x on the current line.
w Move the cursor forward by a word.
b Move the cursor backward by a word.
0 Move the cursor to the beginning of the current line.
^ Move the cursor to the first character on the current line.
$ Move the cursor to the end of the line
) Move the cursor forward to the next sentence. (Useful when editing e-mail or text documents.)
( Move the cursor backward by a sentence.
Move efficiently through the file
vim has many commands that can send you to where you want to go in your file --
there's rarely a need to scroll manually through it. The below keystrokes are not
technically motions, since they move around in the file instead of in a particular line.
vim has a very nice keyword completion system. This means that you can type part of a
long word, press a key, and have vim finish the word for you. For instance, if you have a
variable called iAmALongAndAwkwardVarName somewhere in your code, you probably don't
want to type the whole thing in every time you use it.
To use keyword completion, just type the first few letters of the string (e.g. iAmAL) and
press <C-N> (that means hold down Ctrl and type N) or <C-P>. If vim doesn't give you the
word you want at first, keep trying -- vim will cycle through all completions it can find.
Unlike the original vi, vim allows you to highlight text and perform operations on it.
There are three main visual selection modes (that is, text highlighting modes). These
modes are as follows:
v Characterwise selection mode. This is the selection mode that most people are used to, so
practice with it before trying the others.
V Linewise selection mode. Whole lines are always selected. This is better than characterwise
mode when you want to copy or move a group of lines.
<C- Blockwise selection mode. Extremely powerful and available in very few other editors. You can
V> select a rectangular block and any text inside that block will be highlighted.
All the usual cusor movement keys apply -- so, for instance, vwww would go into visual
selection mode and highlight the next three words. Vjj would go into linewise visual
selection mode and highlight the current line and the two lines below it.
Once you have a highlighted selection, you probably want to do something with it. Some
of the more useful commands you can give when an area of text is highlighted:
d Cut (delete) the highlighted text and put it into the clipboard.
y Copy (or yank, which is vim-ese for "copy") the highlighted text into the clipboard.
c Cut the highlighted text into the clipboard. This is just like d, except it leaves the editor in insert
mode.
Cutting and copying from non-visual selections
If you know exactly what you want to copy or cut, you can do it without entering visual
mode. This saves time.
d{motion} Cut the text moved over by {motion} to the clipboard. For instance, dw would cut a word
and dfS would cut from the cursor up to and including the next capital S on the current
line of text.
y{motion} Copy the text moved over by {motion}.
c{motion} Cut the text moved over by {motion} and leave the editor in insert mode.
dd Cut the current line.
yy Copy the current line.
cc Cut the current line and leave the editor in insert mode.
D Cut from the cursor to the end of the current line.
Y Yank the whole line, just like yy. (Yes, it's inconsistent! You can use y$ to do what you
would expect Y to do.)
C Cut from the cursor to the end of the current line and leave the editor in insert mode.
x Cut the current character. (This is sort of like a command-mode backspace.)
s Cut the current character and leave the editor in insert mode.
Pasting
Pasting is easy. Put the cursor where you want the pasted text and type p.
Using multiple clipboards
Most editors have a single clipboard. vim has many more; clipboards in vim are called
registers. You can list all the currently defined registers and their contents by typing
:reg. Typically, you'll be using the lowercase letter registers; the others are used for
various internal vim purposes and are only occasionally helpful.
To use a specific register for a copy or paste operation, simply type "a before the
command for the operation, where a is the register you want to use.
For example, to copy the current line into register k, you could type "kyy. (You could also
type V"ky. Why would that work?). That line would stay in register k until you specifically
copied something else into register k. You would then use "kp to paste the text from
register k.
Avoiding repetition
The amazing . command
In vi, typing . (a period) will repeat the last command you gave. For instance, if your
last command was dw (delete word), vi will delete another word.
Using counts
Counts are one of the most powerful and time-saving features of vim. Any command can
be preceded by a number. The number will tell vim how many times to execute the
command. Here are a few examples:
Recording macros
Occasionally, you'll find yourself doing the same thing over and over to blocks of text in
your document. vim will let you record an ad-hoc macro to perform the operation.
qregister Start macro recording into the named register. For instance, qa starts recording and puts
the macro into register a.
q End recording.
@register Replay the macro stored in the named register. For instance, @a replays the macro in
register a.
Keep in mind that macros just record your keystrokes and play them back; they are not
magic. Recording macros is almost an art form because there are so many commands
that accomplish a given task in vim, and you must carefully select the commands you
use while your macro is recording so that they will work in all the places you plan to
execute the macro.
]p Just like p, but it automatically adjusts the indent level of the pasted code to match that of the code
you paste into. Try it!
% Putting the cursor on a brace, bracket, or parenthese and pressing % will send the cursor to the
matching brace, bracket, or parenthese. Great for fixing parse problems related to heavily nested
blocks of code or logic.
>> Indent the highlighted code. (See the earlier section about efficient text selection. If no text is
selected, the current line is indented.)
<< Like >>, but un-indents.
gd Go to the definition (or declaration) of the function or variable under the cursor.
K Go to the man page for the word currently under the cursor. (For instance, if your cursor is
currently over the word sleep, you will see the man page for sleep displayed.)