FAQ

1.0 Waht is Vi

1.1 Advantages

1.2 VI is Hard to Learn

1.3 OS

1.4 Where to Start

1.5 Vi Clone

2.0 Hints of Learning VI

2.1 Learning By Playing Game

2.2 Command Modes and Insert Mode

2.3 ESC Key

2.4 End of File Symbols

2.5 HJKL

2.6 Quit Without Saving

2.7 Insert a File

2.8 Search

2.9 Search a Control Sequence

2.10 Reformat

2.11 Cut and Paste

2.12 Undo

2.13 Partition a file

2.14 Ex

3.0 Search and Replace

3.1 Search Key

3.2 Run a Command

3.3 Recovery

3.4 Tips

3.5 Macros

3.6 Function Keys

3.7 Abbreviataion

3.9 Dos2UNIX

3.11 Dumb

3.10 Open Mode

5.1 VI Tricks

5.2 Macros

6.0 Quick Reference

6.1 Ex Commands

6.2 Set Options

7.0 Set up .exrc

7.1 Sample .exrc file

8.0 Bugs

9.0 Glossary of terms

10.0 Bibliography of Books that cover vi


Untitled Document
1.0 Waht is Vi
What is vi?
 
Original Material is from E. Larry Lidz's FAQ.
   
vi is a Visual Editor (hence the name -- vi for VIsual). What is a visual editor (as opposed to a non-visual one)? Visual editors are ones that let you see the document that you are editing as you edit it. This seems pretty common in most editors today, so the idea of a non-visual editor is a little strange. Examples of non-visual editors are sed, ex, ed, and edlin (the last one being the editor shipped with DOS until relatively recently.) vi was written by William Joy as part of the bsd distribution of Unix. It was later used by AT&T, and has been standard Unix since.
Wed Mar 16 00:33:50 CST 2011

Untitled Document
1.1 Advantages
What is the big deal about vi? Why does anyone use it? More importantly, why should *I* use it?
   
vi is default visual editor under Unix, and is therefore shipped with all recent version of Unix. (Recent being defined as post 1984 or so.) This means that whenever you run across a machine that is running a Unix of some sort, you will know that you have a powerful editor at your finger tips. Why else? vi is a powerful editor. Also, once you know vi, you can edit files really quickly, as it is extremely economical with the keystrokes. Due to its different modes for inserting and issuing commands, it is much faster than most non-mode based editors. It is also a very small editor. (The version on my machine is 200k) Also, it can do almost anything, as long as you know how to get it to do what you want.
Wed Mar 16 00:33:52 CST 2011 Untitled Document
1.2 VI is Hard to Learn
Wow! This sounds great! Is there any reason not to use vi?
   
Yes. There is a very good reason. It can be somewhat hard to learn, and until you do so, it will be slow and painful. Once you learn it, it will be faster, but the process of learning it is slow. I've been asked if vi was an easy editor to learn, whether it was intuitive or not. My general response to this question is: "Yes, some of us think so. But most people think that we are crazy."
Wed Mar 16 00:33:52 CST 2011 Untitled Document
1.3 OS
What different operating systems is vi available for?
   
Unix. That's it. However, there are many, many clones of vi that are available for different operating systems. I personally have used vi clones under: Unix, Dos, OS/2, Mac System 7. (See below for a list of specifics.)
Wed Mar 16 00:33:53 CST 2011 Untitled Document
1.4 Where to Start
Okay, you've convinced me. I'm going to learn vi. Where do I start?
 
Book
   
Well... That's a tricky one. There are many good books out there that cover vi; most books on Unix have at least one chapter devoted to it. There are also many books devoted specifically to vi. I don't have any preference, so your best bet might be to ask your local vi guru where they learned.
 
Play Around
   
Fire up vi with a non-important document (your dissertation is NOT a good document to learn vi with...) and play around. I can't imagine anyone learning vi without playing around with it quite a bit.
   
Remember, if you get confused, just hit the Escape key a couple of times, and you'll be in command mode again.
   
I should mention at some point, and I guess here is as good a place as any, that people who think they might want to do Unix system administration, or any type of configuration of unix machines will probably also want to learn ed or ex, as some versions of Unix do not put vi in the root partition, and one might be stranded without it at some point. Ed is a good choice.
Wed Mar 16 00:33:54 CST 2011 Untitled Document
1.5 Vi Clone
What are some of the vi clones that are available?
   
Just to list a few: STvi (STevie), elvis, vile, vim, and nvi, xvi.
   
elvis is available for: Amiga, DOS, OS/2, Unix, VMS, Atari.
   
STevie is available for: Atari ST, DOS, Unix, Mac System 7.
   
nvi is the vi that will ship with BSD 4.4.
   
vim is available for: Amiga, DOS, Mac System 7, Unix.
   
vile is available for: DOS, OS/2, Unix, VMS, Window95, WindowsNT (console mode onle).
   
The source is available at: ftp://id.wing.net/pub/pgf/vile
   
xvi is available for: DOS, Unix.
   
Mortice Kern Systems (support@mks.com), who I have absolutely no affiliation with, offers a commercial version of vi for DOS/Windows, OS/2, and WindowsNT.
   
There are some differences between the different vi clones. Many offer improvements, but most still allow the commands that are listed in this document, but there may be some differences. Refer to the documentation that comes with the clone for details.
Wed Mar 16 00:33:55 CST 2011 Untitled Document
2.0 Hints of Learning VI
Learning vi.
 
Basic Hints for the novice vi user
   
First, keep a command summary with you at all times.
   
A quick reference guide/command summary is included later on.
   
Second, get a good book that covers vi.
   
As for choosing a book, the standard rules apply:
  
look at it before buying it. See if any of it makes sense to you. Make sure that it has exercises that you can practice with. Compare it with other books -- after all, vi can be very confusing, and you want to make sure that it is the book that is confusing, and not just that you underestimated the difficulty of learning vi.
   
Also, seek out vilearn or vitutor, programs designed to teach you the basics of vi.
Wed Mar 16 00:33:56 CST 2011 Untitled Document
2.1 Learning By Playing Game
What games will help me learn vi?
   
This may seem a bit silly, but there are many games on Unix systems that can help you learn to use vi. These help particularly with the basics. Although I don't know of any games that help with every vi command, I do know of a few that will help you learn to use hjkl to move the cursor around. NetHack, a rogue-like game, is particularly good for this, as it is a large game and can be entertaining for quite some time. Not to make the other games sound worse, but some other ones are: rogue, moria, omega, worm, and snake.
Wed Mar 16 00:33:58 CST 2011 Untitled Document
2.2 Command Modes and Insert Mode
What is the difference between Command mode & Insert mode?
   
Often cited as one of the main problems with vi, and equally often cited as being one of its best strengths, vi differentiates between a "Command mode" and an "Insert mode." Understanding this difference is VITAL to learning vi. When one starts vi it starts in command mode. In this mode, one can move around the file, and issue commands to change certain areas of the text, cut, copy and paste sections of the text and do much more. Insert mode is where one can actually insert text. In other words, command mode is used to move around the document, and insert mode is used to type text into the document.
   
Commands such as: a, i, c, C, O, o and others will switch one from command mode to insert mode.
   
<Esc> or <ctrl-c> will take one out of insert mode and return one to command mode.
   
Get used to this distinction. It is one of the things that makes vi different from most other editors. It also allows one to do a lot of things without taking one's hands from the standard keyboard position.
Wed Mar 16 00:33:59 CST 2011 Untitled Document
2.3 ESC Key
Wait, my keyboard doesn't have a <Esc> key! What should I do?
   
Try hitting <ctrl-[> instead. If your keyboard has a <Meta> key, try that. If neither of these work, try <ctrl-3>. Some DEC terminals use the F11 key as escape.
Wed Mar 16 00:33:59 CST 2011 Untitled Document
2.4 End of File Symbols
What are all of those ~s?
   
They're just there to let you know where the bottom of your file is, they are not actually in your document, and you do not need to worry about them.
Wed Mar 16 00:34:01 CST 2011 Untitled Document
2.5 HJKL
I can't get used to using hjkl, do you have any suggestions?
   
First, if your terminal is set properly and you have a good connection, you should be able to use the arrow keys. However, if you think that you will be using vi a lot, then it makes sense to learn hjkl, as they are faster to type. Also, there are occasions where you may have a bad connection and the ESC sequences may get lost.
Wed Mar 16 00:34:02 CST 2011 Untitled Document
2.6 Quit Without Saving
How do I quit without saving?
   
:q! will do it. If vi appears to have frozen, make sure that you haven't hit <ctrl-S> by mistake. In order to undo a <ctrl-s>, hit <ctrl-q>.
Wed Mar 16 00:34:04 CST 2011 Untitled Document
2.7 Insert a File
How do I insert a file?
  :r <filename>
   
This will insert the file at the current location in the file you are working on. If you specify a number before the r, it will insert it at that location in the file.
Wed Mar 16 00:34:04 CST 2011 Untitled Document
2.8 Search
How do I search for text?
   
/<text> will search forward.
   
?<text> will search backwards.
   
?? or // will repeat the last search.
   
It is worth noting that these are pretty much standard in Unix.
   
In addition, in vi, n will find the next occurrence.
   
N will repeat the last search, reversing the direction.
   
Regular Expressions may be used within searches.
Wed Mar 16 00:34:06 CST 2011 Untitled Document
2.9 Search a Control Sequence
How do I search for a control sequence?
  /<ctrl-v><ctrl-<seq>>
  
<ctrl-v> will tell vi to take the next character literally, and not to take it as a command.
Wed Mar 16 00:34:07 CST 2011 Untitled Document
2.10 Reformat
How do I reformat text?
   
If your computer has the program fmt on it, all you need to do is type !}fmt from command mode (without a : before it). This will rejustify the text from the current location until the end of the paragraph. If your machine does not have fmt, you need to find a similar program. (I gather there are many such programs available from the public domain, but I do not know much about them.)
Wed Mar 16 00:34:07 CST 2011 Untitled Document
2.11 Cut and Paste
How do I copy text?
   
Okay, this might be a bit complicated. Take from this section what you can, and reread it a few times. Also, experiment.
   
"<letter>yy will copy one line of text into register <letter>.
   
(A register is vi-lingo for a place to store data that was cut or copied.)
   
<letter> must be between a and z.
   
"<letter>dd will delete one line and place it in register <letter>.
   
You may use a number before the yy or dd to specify the number of lines.
  
Using an uppercase <letter> will append the text into the register leaving what was there before.
   
"<letter>p will put the text after the cursor.
   
"<letter>P will put it before the cursor.
  
If the register contains the beginning or end of a line, the line will be placed on another line as appropriate.
   
Y may be used as a short cut for yy.
   
In addition, y$, yH, yM, etc. are valid, as are the equivalent d commands.
 
For quick cuts and pastes, no register need be specified.
   
In this case, no appending is allowed, and the register will be removed if another delete command is given. (Including x).
   
For example, to move the previous paragraph, one would go to the top of the paragraph, type "a13dd, move to the position in which one wishes to put the paragraph, and then type "ap to put it below the current line.
   
Now, presumably you want to be able to cut and paste into areas that are not just the end of the line. In order to do this, use m<letter> to mark an area. This letter may be the same as a cut/copy register, they are stored in different area of memory. Then, type "<register>[y or d]`<letter>. Where <register> is the register to put the text into, <letter> is the letter used to make, and yy or dd as appropriate.
Wed Mar 16 00:34:08 CST 2011 Untitled Document
2.12 Undo
Ahhhh!!! I just hit dG and lost my dissertation! What can I do? (Or, I've just made a mistake, what should I do?)
   
u will undo the last command.
   
U will undo changes to the current line.
   
(Granted, a one line dissertation would not be much.)
   
:e! will reload the current document without saving any changes.
   
Deleted text gets stored in the registers numbered from 1 to 9.
   
"<n>p will put the last nth deletion.
  
You can quickly search the registers by trying one, hitting u, and trying the next.
 
(In order to expedite this, vi uses . slightly differently than normal. Instead of repeating the last command, it will try the next register, so all you need to do is: "1p u . u ., etc. until you undo the delete you want to undo.)
Wed Mar 16 00:34:09 CST 2011 Untitled Document
2.13 Partition a file
I've just written my dissertation and have been told that I need to have each section in a different file, what should I do?
   
:[m],[n]w <filename> will save between lines m and n to <filename>.
  
This line numbering method works for almost every : command. If you use :[m],[n]w >> <filename> it will append it to the file.
Wed Mar 16 00:34:10 CST 2011 Untitled Document
2.14 Ex
What's the deal with all of these : commands?
   
The commands that follow a : are commands from the ex editor.
  
These allow a lot of flexibility and power. For example, there are many different ways to search and replace, all of with have some similarities (in fact, they are in some ways the same...)
Wed Mar 16 00:34:10 CST 2011 Untitled Document
3.0 Search and Replace
How do you do a search and replace?
 
Single Line
    :s/old/new/g 
 
All Lines
    :%s/old/new/g 
 
General Case:
    :[range]s/old/new/[cgi] 
   
Where [range] is any line range, including line numbers, $ (end of file), . (current location), % (current file), or just two numbers with a dash between them. (Or even: .,+5 to mean the next five lines).
   
[cgi] is either c, g, i, or nothing.
   
c tells vi to prompt you before the changes,
   
g to change all of the occurrences on a line.
        (type yes to tell vi to change it.)
   
i tells vi to be case insensitive on the search.
 
Another method
    :g/foobar/s/bar/baz/g 
   
This searches for foobar, and changes it to foobaz. It will leave jailbars alone, which the other method will not. Unfortunatly, if jailbars appears on the same line as foobar, it will change, too.
   
Of course you can also use regular expression search patterns, and a few other commands in the replacement part of the text. If you use \( and \) in the pattern to escape a sequence, you can do lots of nifty things.
 
For example:
    :g/\(foo\)bar/s//\1baz/g 
   
change foobar for foobaz.
   
Special sequences allowed are:
& everything which was matched by the search
\[1-9] The contents of the 1st-9th \(\) pair
\u The next character will be made uppercase
\U The characters until \e or \E will be made uppercase
\l The next character will be made lowercase
\L The characters until \e or \E will be made lowercase
\[eE] end the selection for making upper or lowercase
Wed Mar 16 00:34:11 CST 2011 Untitled Document
3.1 Search Key
My / key is broken! How can I search and replace?
   
It doesn't really need to be a /. Lots of things will work fine. (letters, numbers and a few other things won't...)
Wed Mar 16 00:34:12 CST 2011 Untitled Document
3.2 Run a Command
How do I run a program from within vi?
   
:!cmd will run the program cmd.
   
:sh will run an interactive shell.
   
Within this shell, you may, if you want, run vi again.
 
This is particularly useful when you are editing makefiles and config files for programs in an attempt to get a program to compile. The advantage over :e is that you do not need to save the file, and it will be in its old place when you exit the shell. (I advise saving the file anyway...)
Wed Mar 16 00:34:13 CST 2011 Untitled Document
3.3 Recovery
Ahhh!! I was writing my dissertation, and the computer crashed!
vi -r <filename>
Wed Mar 16 00:34:13 CST 2011 Untitled Document
3.4 Tips
Any tips for making vi programmer friendly?
   
:set ai
   
auto-indent
   
:set sw=#
   
where # is a number will set the shiftwidth (tabwidth).
   
You can then use <<, >> to shift a line left or right.
   
Plus, you can use <% to shift a {, ( or [ set left or right (with >%).
   
You must be on top of the specific {, }, (, ), [ or ] of the pair to shift them.
   
:set sm
   
show the matching {, ( or [ when you type the closing one.
   
:set lisp
   
make some changes that are useful for lisp programming.
  
() will move back and forth over s-expressions, and {} will move without stopping at atoms.
Wed Mar 16 00:34:14 CST 2011 Untitled Document
3.5 Macros
Macros -- How do I write them?
  :map <lhs> <rhs> 
   
where <lhs> is up to ten characters and
   
<rhs> is up to 100.
  
This will make it so that whenever you type <lhs> it will replace it with <rhs>.
   
All macros should start in command mode (except those defined with map!), but may end in any mode you desire.
   
Remember to use <ctrl-v> before any control characters that you may use.
   
If you are using an Ex command, such as |, it needs to be escaped which scanning the line. You should map is as :map foo <ctrl-v><ctrl-v>|.
   
:unmap <lhs>
   
remove the macro.
   
:map! <lhs> <rhs>
   
make <lhs> insert <rhs> into the text of the document.
   
map! macros may have lhs's that are much longer.
Wed Mar 16 00:34:15 CST 2011 Untitled Document
3.6 Function Keys
How do I make a function key a Macro?
   
If <lhs> is #n where n is 0-9, it will be mapped to the appropriate function key.
Wed Mar 16 00:34:15 CST 2011 Untitled Document
3.7 Abbreviataion
Is there anyway to abbreviate text?
   
:ab email ellidz@midway.uchicago.edu
  
whenever you type email as a specific word, it will extend it to the entire unabbreviated word.
   
:una email
   
unabbreviate it.
Wed Mar 16 00:34:16 CST 2011 Untitled Document
3.9 Dos2UNIX
How do I get rid the ^M's at the end of each line of my file?
 
How do I make a macro to do it?
   
These generally appear from DOS files that get converted to Unix. They're easy to get rid of.
  :%s/<ctrl-v><enter>//g will do it.  
   
The macro bit is a bit trickier. Not something that most people can guess on their own. Here it is:
  map v :%s/<ctrl-v><ctrl-v><ctrl-v><ctrl-v><ctrl-v><enter>//g
   
Yes, that's right. 5 of them. The last one is to escape the enter. Two of the other four are to escape the other two <ctrl-v>'s. Since the macro gets read on the ex line, you need to have two <ctrl-v>'s (since you are searching for <ctrl-v> <enter> to replace it with nothing...)
   
In general, if you are having a trouble with macro that uses the ex line, you need to escape things a lot. Sometimes it is quicker to just keep throwing <ctrl-v>'s in until it works.
Wed Mar 16 00:34:17 CST 2011 Untitled Document
3.11 Dumb
I've got a hardcopy terminal, can I still use vi?
   
vi will start up in a specific mode, called "open mode" in this situation. Things work more or less the same. Deleted characters will appear on your print out at \'s. vi will act as if the size of the window is only one line. ^r will retype the current line. z redraws the window around the current line.
Wed Mar 16 00:34:18 CST 2011 Untitled Document
3.10 Open Mode
But I don't have a hardcopy terminal, and it still starts in open mode!
   
Well, what is happening here is that vi doesn't know what type of terminal you have. It decides that in this situation the best thing to do is to assume that you have the worst terminal possible. This might not seem useful, as not very many people need open mode, but it also is the mode that needs to know the least information about your terminal.
   
Now, how to deal with it. It is possible to change it for the specific session, but in general, this is not useful. If you know your terminal type, you can set it from the Unix prompt (setenv TERM <termtype> under csh and it's variants, and: TERM=<termtype> ; export TERM under sh and its variants.).
   
Better yet would to be to edit your .profile or .chsrc to include this so it is automatically done for you when you login. (Of course, you need to either know ed or be able to set it at the unix prompt before you'll be able to edit the file...)
   
If you do not know your terminal type, try vt100. Most modern terminals and terminal emulators can emulate vt100. If this does not work, find someone to help you.
Wed Mar 16 00:34:19 CST 2011 Untitled Document
5.1 VI Tricks
Silly vi tricks
xp This will delete the character under the cursor, and put it afterwards. In other words, it swaps the location of two characters.
ddp Similar to xp, but swapping lines.
yyp duplicate a line
uu Undo and redo last change. .br (This will take you to the last modification to the file without changing anything.) You can also use this to compare the changes to a line. Make the changes to the line, press U to undo the changes to the current line, and then press u to toggle between the two versions.
Wed Mar 16 00:34:20 CST 2011 Untitled Document
5.2 Macros
Silly macros
Swap character and one vertically above: map * kxjphxkP
Fold a line that's too long map g $80<ctrl-v><ctrl-v>|F r<ctrl-v><enter>
Change case on most words map v ywmno<ctrl-v><esc>P:s/./\~/g<ctrl-v><enter>0"nDdd`n@n
Put `and' around the current word map *` i`<ctrl-v><esc>ea'<ctrl-v><esc>
Put 'and' around the current word map *' i'<ctrl-v><esc>ea'<ctrl-v><esc>
Put "and" around the current word map *" i"<ctrl-v><esc>ea"<ctrl-v><esc>
Put `and' around the current word map! `` <ctrl-v><esc>bi`<ctrl-v><esc>ea'
Split a line at the cursor, and put a > at the beginning of the next line. (For quoting Usenet, etc). If word wrapping is enabled, it might wrap the last word on the first line. map g may0O<ctrl-v><esc>P`ay$:s/./ /g0i><ctrl-v><esc>`aPa<ctrl-v><esc>D
Insert one character map g i$^[r
Format a paragraph without the fmt program. (To use, use J a few times, then this a few times) map K 072lBhr
Make ctrl-x work as cut, ctrl-v as paste, ctrl-p as copy. You should mark the beginning of the area as m (use mm). (ctrl-c cannot be remapped) map <ctrl-v><ctrl-x> "zd`m
map <ctrl-v><ctrl-p> "zy`m
map <ctrl-v><ctrl-v><ctrl-v><ctrl-v> "zP
Save a read-only file. Careful, it changes the permisions. map K :!chmod 666 %<ctrl-v><enter>:w!<ctrl-v><enter><ctrl-v><enter>
vi status line (sort of...) [Note: It's slow...] map <ctrl-v><up-arrow> k<ctrl-v><ctrl-g>
map <ctrl-v><down-arrow> j<ctrl-v><ctrl-g>
map k k<ctrl-v><ctrl-g>
map j j<ctrl-v><ctrl-g>
map <ctrl-v><ctrl-f> <ctrl-v><ctrl-f><ctrl-v><ctrl-g>
map <ctrl-v><ctrl-b> <ctrl-v><ctrl-b><ctrl-v><ctrl-g>
map H H<ctrl-v><ctrl-g>
map M M<ctrl-v><ctrl-g>
map L L<ctrl-v><ctrl-g>
map G G<ctrl-v><ctrl-g>
map <ctrl-v><ctrl-u> <ctrl-v><ctrl-u><ctrl-v><ctrl-g>
map <ctrl-v><ctrl-d> <ctrl-v><ctrl-d><ctrl-v><ctrl-g>
center a line map = 80I <ctrl-v><esc>$78hd0:s/ / /g<ctrl-v><enter>$p
redefines tab so that it inserts 5 spaces instead of a tab marker map! <ctrl-v><ctrl-i> <space><space><space><space><space>
switch current and last line (repeat to reverse a file) map v Gdd''Pj
Wed Mar 16 00:34:20 CST 2011 Untitled Document
6.0 Quick Reference
Alphabetical vi quick reference
   
. command, as appropriate. This is normally a cursor movement keys (h,j,k,l,w,b, etc.) or a line number.
(spacebar) next character
(return) next line
# (where # is a number) following command n times...
: go to ex-mode
) next sentence
( previous sentence
} next paragraph
{ previous paragraph
]] next section
[[ previous section
0 beginning of line
$ end of line
^ first non-whitespace character
+ first character of next line
- first character of previous line
/ search forward
? search backward
% find match of current parenthesis, brace, or bracket
, reverse direction of last f, F, t, or T
; repeat last f, F, t, or T
. repeat last command
` goto mark
' goto beginning of line with mark
`` return to previous mark or location before a search
'' go to start of line of previous mark or location before search
~ switch case of current character
" store in register
!! repeat last shell command
! send next to command, replace output (eg !}fmt passes the current paragraph to the command fmt, and replaces the output with whatever fmt returns.)
>> shift paragraph one shiftwidth to the right
<< shift paragraph one shiftwidth to the left
>% shift until matching (, [, or { to the right
<% shift until matching (, [, or { to the left
a append after the current location
A append at the end of the line
^a unused
b beginning of previous word
B beginning of previous word, ignore punctuation
^b scroll back one screen
c change until...
C change to end of line
^c ends insert mode, unused in command mode
d delete until...
D delete to end of line
^d scroll down half a window, moves to previous shiftwidth in insert mode
e end of word
E end of word, ignore punctuation
^e scroll screen down one line
f find...
F find backward...
^f scroll forward one screen
g unused
G ...Goto [defaults to end of file]
^g show status line
h left
H first line on screen
^h backspace in insert mode, left in command mode
i insert before current location
I insert before first non-whitespace character on line
^i tab in insert, unused in command
j down
J join next line with current line
^j down in command, create newline in insert
k up
K unused
^k unused
l right
L last line on screen
^l redraw screen
m mark position into register
M middle of screen
^m carriage return
n repeat last search
N repeat last search, reverse direction
^n down in command
o open line below current
O open line above current
^o unused
p put below current line
P put above current line
^p up in command
q unused
Q quit and run ex
^q unused
r replace current character
R replace characters until insert mode is left
^r redraw screen in command mode
s substitute
S substitute entire line
^s unused
t to...
T backward to...
^t moves to next shiftwidth.
u undo last change
U undo changes to current line
^u scroll up half a window
v unused
V unused
^v unused
w beginning of next word
W beginning of next word, ignore punctuation
^w unused in command, in insert move back to beginning of previous word
x delete current character
X delete previous character
^x unused
y yank...
Y yank current line
^y scroll screen up one line
z reposition screen around line (Return to top of screen, . to middle, - to bottom)
ZZ write and quit
^z unused
Wed Mar 16 00:34:21 CST 2011 Untitled Document
6.1 Ex Commands
Command mode input options ( : commands)
:r <file> read <file> into current text
:r !<command> read output from command <command> into current text
:nr <file> read in at line number
:!<file> run command, return
:sh goto shell
:so <file> read and execute commands from <file>
:x write and quit
:wq write and quit
:l1,l2w <file> write between lines l1 and l2 to <file>. If <file> is not specified, assume current. If l1,l2 not specified, assume entire file (making it :w)
:w >> <file> append to <file>. May use line numbers
:w! overwrite current file
:q quit
:q! quit, forget changes
:e <file> edit <file> without leaving vi
:e! forget changes since last write
:n edit next file
:e +n <file> edit <file> at line n, if no end, assume end of file
:n <files> specify <files> as new list of files to edit
:e# edit alternate file (if :e <file> is used, alternate is the original file)
:args show files to be edited
:rew rewind life of files to top
:map m n create a macro (make m do n)
:map! m n create an insert mode macro (make m do n)
:unmap m destroy macro m
:unmap! m destroy insert mode macro m
:ab <1> <2> abbreviate - replace <1> with <2> whenever typed as a word
:unab <1> unabbreviate <1>
:set <option> set <option>...
Wed Mar 16 00:34:22 CST 2011 Untitled Document
6.2 Set Options
set options
 
Syntax:
:set <option> <param> (If <param> is expected)
:set <option>? displays the value of the <option>
:set all displays the value of all the options.
   
For options without a value, set no<option> turns it off.
   
The abbreviations in parenthesis may be used.
Option: Default: What it does:
autoindent (ai) noai Makes new lines automatically indent to the position as the line above or below
autoprint (ap) ap Display changes after each command
autowrite (aw) noaw Automatically save file before :n, :!
beautify (bf) nobf Ignore all control characters during input (except tab, newline, formfeed)
directory= (dir=) /tmp Name of the directory to store buffer
edcompatible noedcompatible Use ed-like features on substitute
errorbells (eb) errorbells Sound bell on error
exrc (ex) noexrc Allow .exrc files outside home dir
hardtabs= (ht=) 8 Set boundary for hardware tabs
ignore case (ic) noic Ignore case in regex expressions
lisp nolisp Turn on lisp mode
list nolist Display all tabs, end of lines
magic magic Enable more regex expressions
mesg mesg Allows mesgs to be sent to terminal
number (nu) nonumber Displays line numbers in file
open open Allows open and visual
optimize (opt) optimize Optimizes throughput of text by not sending carriage returns when printing text
paragraphs= (para=) IPLPPPQPPLIbp Sets the delimiters for { & }
prompt prompt Command mode input gives : prompt
readonly (ro) noro Cannot write unless ! is given
redraw noredraw Redraw screen when edits are made
remap remap Allows macros that point to other macros
report= 5 Report changes if they effect > x lines
scroll 1/2 window Amount of screen to scroll when scroll down is received in command mode. Also, number of lines printer by z. (z prints 2*scroll)
sections= SHNHH HU Defines end of section for [[ and ]]
shell= (sh=) /bin/sh Default shell. Uses SHELL environment, if set
shiftwidth= (sw=) 8 Characters to shift when using shift commands
showmatch (sm) nosm Show matching {, }, (, ), [, or ]
showmode noshowmode Shows which mode you are in.
slowopen (slow)   Do not update display immediately after insert
tabstop= (ts=) 8 Sets tabstop length
taglength= (tl=) 0 Number of characters significant for tags (0 means all characters)
tags= tag, /usr/lib/tags Define pathname of files containing tags.
term=     Set the terminal type
terse noterse Display shorter error messages
timeout (to) timeout Keyboard maps timeout after one second
ttytype=     Set the terminal type
warn warn Display "No write since last change" messages
window= (w=)     Number of lines in window in visual mode
wrapmargin= (wm=) 0 Set the right margin. Greater than 0 will word wrap n spaces from the edge of the screen
wrapscan (ws) ws Searches wrap around end of file
writeany (wa) nowa Allow saving to any file
Wed Mar 16 00:34:24 CST 2011 Untitled Document
7.0 Set up .exrc
Setting up .exrc file
   
Any commands that can be used in command input mode ( : commands), may be used in a .exrc, which will load automatically whenever you start vi. In addition, the source command (so), abbreviations (ab), and macros may be used. There may not be any blank lines in your .exrc.follows is a comment.
Wed Mar 16 00:34:24 CST 2011 Untitled Document
7.1 Sample .exrc file
Sample .exrc file
   
This .exrc file is a real one. Mine. Because of that, it doesn't set as many options as one might wish it did to get a good idea of what may be used. However, it should get the basic idea down, and it is quite straightforward.
   
First, note that you do not need to specify the :, it is assumed.
" Ignore case on search
set ic
" set wordwrap 9 characters from the right
set wm=9
" show matching parenthesis
set sm
" set the shell to be zsh
set sh=/nfs/kimbark/k4/ellidz/bin/zsh
" a few abbreviations for my email addresses
ab zidlle E. Larry Lidz - ellidz@midway.uchicago.edu
ab --l -Larry
" uppercase V will run ispell -x (-x tells it not to save backups) on current
" file
map V :w<ctrl-v><enter>:!ispell -x %<ctrl-v><enter>:e!<ctrl-v><enter><ctrl-v><enter>
" = will center the line...  if I can get it to work
map = 80I <ctrl-v><esc>$78hd0:s/  / /g<ctrl-v><enter>$p
" v will reformat the current paragraph
map v {0!}fmt<ctrl-v><enter>
" Splits a line in two at current cursor location, puts a > at the
"beginning of the line
map g may0O<ctrl-v><esc>P`ay$:s/./ /g<ctrl-v><enter>0i><ctrl-v><esc>`aPa <ctrl-v><esc>D
" Change the case on the current word
map K ywmno<ctrl-v><ctrl-v><ctrl-v><esc>P:s/./\~/g<ctrl-v><ctrl-v><ctrl-v><enter>0"nDdd`n@n
Wed Mar 16 00:34:25 CST 2011 Untitled Document
8.0 Bugs
Bugs in vi
   
I'd like to say that vi is bug free, but unfortunatly, it's not. These bugs are bugs in the original vi, not necessarily in any of the different clones.
   
Macros for _ do not always work properly.
   
#~ does not work under AIX
Wed Mar 16 00:34:26 CST 2011 Untitled Document
9.0 Glossary of terms
Glossary of terms
   
This glossary will be updated as people suggest terms that they do not understand. Please let me know if you have any suggestions.
command mode Command mode is the mode within vi where the user gives commands to vi. (Including cursor movement commands, editing commands, etc.)
ed A non-visual editor under unix.
<Esc> The escape key. A key on a keyboard normally marked by escape. Sometimes ^[ will work in its place. If there is no escape key, sometimes the Meta key will work.
ex An editor under unix, all commands preceded with : are passed to it.
insert mode Insert mode is the mode within vi where text is inserted into the document.
macro A macro is a shortcut key combination. For example, a macro allows one to hit one letter and have it execute a few different commands.
open mode Open mode is the mode that vi will start in if it cannot determine your terminal type, or if it believes you have a hardware or glass-tube terminal.
regular expressions (RegEx) (RE) Regular expressions, commonly known as "RegEx" or "REs" are a set of key combinations that are meant to allow people to have a large variety of control over what they are searching for. RegEx is used a lot under Unix, and is common between many programs.
sed Stream editor. An editor that has no interface. All commands are given from the command line.
vi The editor to which this FAQ is dedicated.
Wed Mar 16 00:34:27 CST 2011 Untitled Document
10.0 Bibliography of Books that cover vi
Bibliography of Books that cover vi
  The ULTIMATE GUIDE to the VI and EX Text Editors
  Hewlett Packard Company (authors)
  The Benjamin/Cummings Publishing Company, Inc.
  ISBN 0-8053-4460-8
  A PRACTICAL GUIDE TO THE UNIX SYSTEM
  Mark G. Sobell
  Benjamin Cummings Publisher
  LEARNING THE VI EDITOR
  Linda Lamb
  O'Reilly & Associates
  ISBN 0-937175-67-6
  UNIX POWER TOOLS  (particularly for macros)
  O'Reilly & Associates
Wed Mar 16 00:34:27 CST 2011