Vi is the most commonly available screen editor for UNIX. It's the only one you can count on being installed on every Unix system.
Free versions are also available on just about any other operating system, from Atari to Xenix, including Windows and MacOS. There are even graphical versions with tear-off menus and color highlighting! See the links page for more info.
The focus of this page is to get you started which is often the hardest part of learning. More powerful features are left out, but I'll demonstrate some of them at then end.
I've handed out a reference card that I think is a good one. The author's web site is on the links page. I also recommend the book Unix in a Nutshell, which is available at most bookstores. There are books devoted to the just the Vi editor too.
Like most programs, Vi has a large number of commands, but you'll find yourself using only 4 or 5 most of the time.
IMPORTANT THING TO LEARN FIRST:
Editing Modes (or , "why Vi is (supposedly) 'confusing' ")
The most important thing to know about Vi is that it has two
modes, Command Mode and Insert Mode.
In Command Mode, you can invoke editing commands, move the cursor, save or exit the file, or enter Insert Mode.
In Insert Mode, you can insert stuff.
Before We Start
We need to create a new file alphabet.html under vi_class directory.
Ensure that you are in your
$ cd ~/public_html
$ mkdir vi_class
$ cd vi_class
$ vi alphabet.htm
Now type :set showmode and hit Enter.
Editing Your File
When you open a file with vi, you are automatically placed in command mode.
Press the i key (insert) to switch to input mode.
Input the following text (the alphabet) exactly as presented. Put a
<P> tag at the end of each line.
Don't worry if you make a mistake you can't correct. We'll deal with it later.
Return to command mode Esc
Save your file :w
Moving in Command Mode
Moving by characters
Try these commands out
h left a character
j down a character
k up a character
l right a character
or use the arrow keys
Moving by words
b back one word (
B to ignore punctuation)
w forward one word (
W to ignore punctuation)
Moving by lines
0 beginning of line
$ end of line
:14 moves to line 14)
G end of file
1G beginning of file
Moving by screens
Ctrl-u scroll up 1/2 screen
Ctrl-d scroll down 1/2 screen
Ctrl-f scroll forward 1 screen
Ctrl-b scroll backward 1 screen
H move to the top of the screen
M move to the middle of the screen
L move to the last line of the screen
Fixing Mistakes and Making Changes
x delete the character under the cursor
dw delete to the end of the current word
dd delete the current line
yw yank a word into the buffer
yy yank the current line
What would 2yy do?
paste the buffer after current line (or cursor if you didnt yank
an entire line)
P paste the buffer before current line/cursor
Try yanking a line, moving the cursor several lines down and pasting.
cw change to the end of the current word (hit Esc when
r replace one character (you're automatically put back in
cW. What's the difference?
Notice the effect when an HTML tag is next to the word.
Operators and Objects
You've probably noticed that
d c y take an action on an
object or objects.
dw deletes a word, etc.
Try out some others:
w word forward
e end of word
$ end of line
G end of file
These are just a few....
It's becoming easier now that you understand the logic?
u undo the last change you made anywhere in the file
U undo all recent changes to the current line
On the same line:
a insert after the cursor
A add at end of current line
i insert text before cursor
I insert at beginning of current line
On a new line:
o open a new line after the current
O open a new line before the current
Saving and Exiting
:x save changes and exit
:w save changes
:q! quit without saving changes
:e! start over without saving changes
/pattern search forward
?pattern search backward
/repeat previous search forward
?repeat previous search backward
Adding Some More Text and Searching
- Make this the first line of the file:
"The quick brown fox jumps over the lazy dog."<P>
How do you get to line 1?
Instead of inserting the file before the existing line 1, how could you open up another line above?
- Make this the last line of the file, type:
"Every good boy deserves fudge."<P>
How do you get to the last line?
Using A to append to the existing line and then hitting Enter is one way to open a new line. What's another?
- Move your cursor to the top of the file.
- Search for the word fudge. Your cursor should be on the f.
- Switch to input mode and add the word chocolate BEFORE fudge.
- Now search backwards to the line with y. Make it a link to Yahoo.
- Do the same with h. Make it a link to Hotbot.
- Save your work without exiting the editor
Deleting, Replacing, Simple Use of Buffers, Recovering from Errors
- Remove the alphabetic characters b,e,z and the <P>
tags, but leave the blank lines in their place.
Use the search command rather than the arrow keys to move about the file.
- Now delete the blank lines.
- Now replace f with z. What command do you use to replace a single character?
- Save your work without leaving the editor.
- Go to the first line in the file.
Now delete the first 5 lines of the file with one command.
Remember that most commands can be applied to multiple objects. You know how to delete 1 line. How do you delete 5?
- You could delete the next 5 (repeat the most recent command) with a single . (a dot). Try it.
- Then, undo this second delete. What's the command to do this?
- Remove the first 10 lines of the file and put them at the end.
Go to line 1 of the file.
Delete the first 10 lines with one command. What is it? Now you have 10 lines in the buffer.
Go to the last line of the file.
You want to paste the buffer after this line. How?
- Now you've decided that you've completely screwed up your file and you want to start over (from the point of the most recent save). How can you bail out and start over? (There are several ways).
Miscellaneous and Complex Stuff
Using set to customize the editing session
Options can be set temporarily in an editing session using the set command.
Undo them with
Put them in your .exrc file in your home directory to make them the default. Type set: to see your current settings. Type :set all to display all options. Look at the man page for vi for explanations.
J joins lines
Ctrl-T tab (note that this command is run in INSERT mode)
>> Shift text right
<< Shift text left
Ctrl-G or :f shows information about the file you are editing
:r filename Read in a file. You could use this for templates.
:r! command Read in the output of a command.
:n Go to the next file (when you have opened multiple files)
vi *.html for example.
:p Previous file
Substitution and filters
We're moving far afield here, but I do want to demonstrate these powerful features
:1,$! tr -d '\015'
Filter out that pesky ^M in files you edited on your PC.
Let's break down this command
:1,$ Line addressing : Apply some action to lines 1 thru the end of the file (
! Use a Unix command as a filter: In this case we use
tr command to remove
\015 which is the ascii
: 1,$ s/seperate/separate/gc
On all lines
text/replacement text/ do it globally(not just the first instance on a
(g) and prompt for confirmation
Put a paragraph tag at the end of lines 14-32. Could've used that one earlier :)
Other applications are limited only by your imagination
What if you wanted to create a macro to do the ^M edit?
You can. Here's how:
Open up the .exrc file in your home directory
Add the following line to map the key combination
map *8 :1,$! tr -d '\015'
If you want the
Enter key too, you have to do a little gyration:
Ctrl-V before you type
Enter when editing
your .exrc file.
Ctrl-V means take the next character literally.
It will look like this:
map *8 :1,$! tr -d '\015'^M
Just typing ^M won't work.
How about abbreviations in insert mode?
:ab hr <HR>
Now when you type hr in your text it automatically expands to
You can make abbreviations and macros permanent by adding them to your .exrc file, or you can make temporary ones by preceding them with a colon
:ab hr <HR>
You can undo it for the current session with
firstname.lastname@example.org Revised 4/20/99