A vi Tutorial

Jim Watts, 1990
(Additional  material by Michael J. Wise)
http://www.eelab.usyd.edu.au/ee_database/programming/vitute.html

Getting Started

Entering vi by typing
vi <filename>
e.g. vi myprog.c, what you see is the beginning of the myprog.c displayed on the screen. If myprog.c is very short, a column of tildes, like this
~
~
~
will appear. These just show that there is nothing more in the file. The bottom line of your screen will contain the name of the file and its size; this is the command line, and we return to it later. To move down to the bottom of myprog.c just type
G
and the final screen of myprog.c will be displayed, with the cursor at the beginning of the last line. To go to line <n>, type
nG
and the cursor will move to the beginning of line <n>.

      To finish a vi session (and saving your changes) type

ZZ
and you will be back in the shell.

Entering Text

As in ed (and sam in the Command window), text can be added by typing
a
but in vi the a does not show on the screen. All text entered after this, including newlines will be displayed following the position of the cursor, pushing the other text down. Unlike other editors, text-entry is terminated with <esc>. Similarly, typing
i
will allow text to be entered in front of the cursor.

Hint: If you are not sure what mode you are in, type <esc> twice, after which you can be sure that are no longer in text-entry-mode. (Assuming it an error, vi will beep when you do this.)

Many commands in vi have a capitalized version, so

A
will add text at the end of the line, and
I
will add text at the start of the line.

In all cases of text entry, <esc> terminates text-entry mode.

Moving Around

Since vi is a screen editor which does not make use of a mouse, the cursor has to be moved from the keyboard. To move straight down by one line type
j
Moving straight up requires
k
Movement by one to the right needs
l
and to move one character left type
h
Note that <space> can be used instead of l to move right.

<return> moves the cursor to the beginning of the next line.

To move more than one line, just type the distance that you want to move before the direction, e.g.

10j
will move 10 lines down, and
6h
will move 6 spaces left. As with pattern matching in sam and ed, ^ refers to the beginning of the line, and $ to the end. To move to the end of a line type
$
and typing
^
will move the cursor to the beginning of the line. Note that the character moves h and l can only occur within the current line.

      You can also move by words (usually much more efficient). To move to the beginning of the next word, type

w
the command
e
moves to the end of the next word, while
b
moves back to the beginning of the last word. These word moves work between lines.

      The boundaries of a word are <space>, <tab> or <return> - the whitespace characters - and punctuation marks (i.e. most characters other than letters or numbers). It is possible to move across punctuation if W, B and E are used instead of w, b and e. Try out the differences between the shifted and unshifted commands.

Note: What works for w, b and e, will not work as expected for h, j, k and l, where the upper-case commands do ENTIRELY different things.

Cursor movements (as can most commands in vi) can be extended by prefixing them with a count, so that

5w
moves the cursor forward by five words.

      The shifted commands H, L and M make movements relative to the whole screen, typing

H
takes the cursor to the top of the screen,
L
takes it to the bottom, and
M
takes it to the middle. Note that K is not a command, and J does not perform a movement, (see section 11. below).

Deletion

To delete the character under the cursor, type
x
the character before the cursor is deleted with
X
or more simply <backspace>.

      When text is deleted, it is not totally lost, but is written into the undo buffer, which is similar to the snarf buffer in sam, or the Macintosh clipboard. Like these, only the text of the last delete is saved. Thus deletions in vi are in fact cuts, which can be pasted back (see below).

      To delete more than one character, the letter d is prefixed to a movement to delete that range. So

dw
deletes the next word and
d7E
will delete all text to the end of the seventh next group of characters. (Remember that E skips over punctuation.) The single character deletions x and X are just abbreviations for dl and dh.
Whole lines of text can be deleted using
dd
which deletes the current line. The command
D
will delete from the cursor to the end of the line.

The Undo Command

To cancel the last operation just type
u
and the text will be restored as it was before the last command. The shifted command
U
will undo any changes that have just been made to the current line.

Pasting Text

Since deletion is actually cutting, there is a pasting command to write the undo buffer. The command
p
writes the buffer immediately after the cursor, or on the next line, if the cut was whole lines. Pasting in front of the cursor, (or on the line above) is done by
P

Copying

It is not surprising that where there is cutting there should be copying. The copying or yanking command y, is used similarly to d, except that the text remains and a copy is buffered, (just like Macintosh or snarf in sam). So
y3w
will yank three words into the buffer. Then you use p or P to put them where you want. To yank lines yy is used. Also the command
Y
will yank one line into the buffer.

Substitution

There are three substitution commands in vi: r, which changes one character, s, which replaces one character with text and c, which allows a range to be replaced.

      To change the character under the cursor, type

r
followed by the new character. To substitute text for the character under the cursor, type
s
followed by the text, and ending with <esc>. It is possible to change a sequence of letters, words or lines, using
c
followed by a movement, then the text, and ending with <esc>. For example, to change the next word you type
cw
In other words, c is like a d (for the specified range), followed by an a.

      There are shifted versions of the substitute commands. R allows text to be changed by typing over it, finishing with <esc>. S substitutes text for whole lines, and C changes text from the cursor to the end of the line.

Searching

This is similar to using the Command window in sam and in ed, but made simpler. To search for a pattern, type
/
followed by the pattern, and ending with <return>. A backwards search uses
?
instead of /. To repeat the search, type
n
typing
N
will repeat the search in the reverse direction.

It is possible to search for a single character in a line using

f
followed by the character. Typing
F
will search from left to right. To repeat the search, type
;
and to reverse it
, (comma)
More will be said about searching with regular expressions in lectures.

Two Useful Commands

It is possible to repeat the last command which changed text by typing
. (full stop)
Also to join a line to the line following, type
J

Using the Command Line

If you type
:
the cursor will move to the bottom line, and you will be able to enter an ed style command. This is particularly useful for operations that are to be done over a number of lines or over the entire file.

Repeated changes can be done from the command line with

<address>s/<old_pattern>/<new_pattern>/g<return>
If the g is omitted, then only the first match on each line within the addressed range will be changed. For example
.,$s/^\.br/.SP/
1,$s/ Vi / vi /g
The first command goes from the current line to the end of the file replacing an occurance of .br appearing at the beginning of a line with .SP. In the second command, all instances of Vi surrounded by single blanks are replaced by vi.

      If a command causes a number of changes to be made, the number of changes is written on the command line, and the cursor moves to the position of the last change.

Writing Out, Quitting and Escaping

To write the file the command
:w
on the command line is the same as sam and ed.

The q command from ed can also be used, but if it is necessary to leave vi without saving any changes, you will have to use

:q!
The effect of writing out the file and quitting can be achieved in one step by typing
:wq
on the command line (which is also what ZZ does).

      It is possible to execute shell commands from within vi (or escapes to the shells). To do this type

:!
followed by the command, which will then be executed. When the command is complete, you will be able to return to the editing session by typing any character, typically spaceA or <return>.

Screen Control

vi has the equivalent of a scroll bar, but this has to be done with control characters.
To move forward in the file by one screen type
<ctrl>F
one screen back is
<ctrl>B
It is possible to move by half screens,
<ctrl>D
moves down, and
<ctrl>U
moves up.

Possible Trouble

Since you will be using control characters, you might by chance hit <ctrl>S, which will lock the screen. You can unlock the screen with <ctrl>Q.
Another unexpected thing that can happen is if you hit Q by mistake, you will go into open mode, and will get : at the bottom of the screen. Type
vi
to get back to the screen.

Final Word

What has been presented above is only a subset of the available commands. For more details, check the man entry for vi.

Another tutorial, similar to this one can be found on the Web at:

http://www.macom.co.il/vi