Professional Documents
Culture Documents
The vi editor is available on almost all Unix systems. vi can be used from any type
of terminal because it does not depend on arrow keys and function keys--it uses
the standard alphabetic keys for commands.
vi has many other commands and options not described here. The following
resources can help you get started using the vi editor, and are available at the UW
University Book Store:
Starting vi
vi filename
where "filename" is the name of the existing file. If the file is not in your current
directory, you must use the full pathname.
vi newname
where "newname" is the name you wish to give the new file.
On-screen, you will see blank lines, each with a tilde (~) at the left, and a line at
the bottom giving the name and status of the new file:
vi Modes
• command mode
• insert mode
In command mode, the letters of the keyboard perform editing functions (like
moving the cursor, deleting text, etc.). To enter command mode, press the escape
<Esc> key.
In insert mode, the letters you type form words and sentences. Unlike many word
processors, vi starts up in command mode.
Entering Text
In order to begin entering text in this empty file, you must change from command
mode to insert mode. To do this, type
Nothing appears to change, but you are now in insert mode and can begin typing
text. In general, vi's commands do not display on the screen and do not require the
Return key to be pressed.
Type a few short lines and press <Return> at the end of each line. If you type a
long line, you will notice the vi does not word wrap, it merely breaks the line
unceremoniously at the edge of the screen.
If you make a mistake, pressing <Backspace> or <Delete> may remove the error,
depending on your terminal type.
When you have gone as far as possible in one direction, the cursor stops moving
and you hear a beep. For example, you cannot use l to move right and wrap around
to the next line, you must use j to move down a line. See the section entitled
"Moving Around in a File" for ways to move more quickly through a file.
Basic Editing
Editing commands require that you be command mode. Many of the editing
commands have a different function depending on whether they are typed as
upper- or lowercase. Often, editing commands can be preceded by a number to
indicate a repetition of the command.
Deleting Characters
To delete a character from a file, move the cursor until it is on the incorrect letter,
then type
The character under the cursor disappears. To remove four characters (the one
under the cursor and the next three) type
4x
X (uppercase)
Deleting Words
To delete a word, move the cursor to the first letter of the word, and type
dw
This command deletes the word and the space following it.
3dw
Deleting Lines
dd
The cursor does not have to be at the beginning of the line. Typing dd deletes the
entire line containing the cursor and places the cursor at the start of the next line.
To delete two lines, type
2dd
To delete from the cursor position to the end of the line, type
D (uppercase)
Replacing Characters
The new character will appear, and you will still be in command mode.
Replacing Words
To replace one word with another, move to the start of the incorrect word and type
cw
The last letter of the word to be replaced will turn into a $. You are now in insert
mode and may type the replacement. The new text does not need to be the same
length as the original. Press <Esc> to get back to command mode. To replace three
words, type
3cw
Replacing Lines
To change text from the cursor position to the end of the line:
1. Type C (uppercase).
2. Type the replacement text.
3. Press <Esc>.
Inserting Text
Appending Text
• (lowercase)
Joining Lines
Undoing
U (uppercase)
Undoing all edits on a single line only works as long as the cursor stays on that
line. Once you move the cursor off a line, you cannot use U to restore the line.
There are shortcuts to move more quickly though a file. All these work in
command mode.
Key Movement
--- --------
w forward word by word
b backward word by word
$ to end of line
0 (zero) to beginning of line
H to top line of screen
M to middle line of screen
L to last line of screen
G to last line of file
1G to first line of file
<Control>f scroll forward one screen
<Control>b scroll backward one screen
<Control>d scroll down one-half screen
<Control>u scroll up one-half screen
Moving by Searching
1. Type / (slash).
2. Enter the text to search for.
3. Press <Return>.
With vi, you edit a copy of the file, rather than the original file. Changes are made
to the original only when you save your edits.
ZZ
The vi editor editor is built on an earler Unix text editor called ex. ex commands
can be used within vi. ex commands begin with a : (colon) and end with a
<Return>. The command is displayed on the status line as you type. Some ex
commands are useful when saving and closing files.
To save the edits you have made, but leave vi running and your file open:
1. Press <Esc>.
2. Type :w
3. Press <Return>.
To quit vi, and discard any changes your have made since last saving:
1. Press <Esc>.
2. Type :q!
3. Press <Return>.
Command Summary
STARTING vi
ENTERING TEXT
BASIC EDITING
x delete character
nx delete n characters
X delete character before cursor
dw delete word
ndw delete n words
dd delete line
ndd delete n lines
D delete characters from cursor to end of line
r replace character under cursor
cw replace a word
ncw replace n words
C change text from cursor to end of line
o insert blank line below cursor
(ready for insertion)
O insert blank line above cursor
(ready for insertion)
J join succeeding line to current cursor line
nJ join n succeeding lines to current cursor line
u undo last change
U restore current line
Command Action
vi file Invoke vi on file
vi file1 file2 Invoke vi on files sequentially
view file Invoke vi on file in read-only mode
vi -R file Invoke vi on file in read-only mode
vi -r file Recover file and recent edits after a crash
vi -t tag Look up a tag and start editing at its definition
vi -w n Set the windows size to n; useful over a slow connection
vi + file Open file at last line
vi +n file Open file directly at line number n
vi -c command Open file, execute command, which is usually a search command
file or line number (POSIX)
vi +/pattern file Open file directly at pattern
ex file Invoke ex on file
Invoke ex on file, taking commands from script; surpress
ex - file <script
informative messages and prompts
ex -s file Invoke ex on file, taking commands from script; surpress
<script informative messages and prompts (POSIX)
2. vi Commands
[command][number]text object
[number][command]text object
Movement Commands
Command Meaning
Character
h, j,
k, l Left, down, up, right
Text
w, W,
b, B Forward, backward by word
e, E End of word
), ( Beginning of next, previous sentence
}, { Beginning of next, previous paragraph
]], [[ Beginning of next, previous section
Lines
RETURN First nonblank character of next line
0, $ First, last position of current line
^ First nonblank character of current line
+, - First nonblank character of next, previous line
n| Column n of current line
H Top line of screen
M Middle line of screen
L Last line of screen
nH n (number) of lines after top line
nL n (number) of lines before last line
Scrolling
CTRL-F, CTRL-B Scroll forward, backward one screen
CTRL-D, CTRL-U Scroll down, up one-half screen
CTRL-E, CTRL-Y Show one more line at bottom, top of window
zRETURN Reposition line with cursor to top of screen
z. Reposition line with cursor to middle of screen
z- Reposition line with cursor to bottom of screen
CTRL-L Redraw screen (without scrolling)
Searches
/pattern Search forward for pattern
?pattern Search backward for pattern
n, N Repeat last search in the same, opposite direction
/, ? Repeat previous search forward, backward
fx Search forward for character x in current line
Fx Search backward for character x in current line
tx Search forward to character before x in current line
Tx Search backward to character after x in current line
; Repeat previous current line search
, Repeat previous current line search in opposite direction
Line Number
CTRL-G Display current line number
nG Move to line number n
G Move to last line in file
:n Move to line n in file
Marking position
mx Mark current position as x
``x Move cursor to mark x
`` Return to previous mark or context
'x Move to the beginning of line containing mark x
'' Return to beginning of line containing previous mark
Editing Commands
Command Action
Insert
i, a Insert text before, after cursor
I, A Insert text before beginning, after end of line
o, O Open new line for text below, above cursor
Change
r Replace character
cw Change word
cc Change current line
cmotion Change text between the cursor and the target of motion
C Change to end of line
R Type over (overwrite) characters
s Substitute: delete character and insert new text
S Substitute: delete current line and insert new text
Delete, move
x Delete character under cursor
X Delete character before cursor
dw Delete word
dd Delete current line
dmotion Delete text between the cursor and the target of motion
D Delete to end of line
p, P Put deleted text after, before cursor
Put text from delete buffer number n after cursor (for last nine
"np
deletions)
Yank
yw Yank (copy) word
yy Yank cureent line
Yank current line into named buffer a (a-z). Uppercase names
"ayy
append text
ymotion Yank text between the cursor and the target of motion
p, P Put yanked text after, before cursor
"aPv Put text from buffer a before cursor (a-z)
Other
Commands
. Repeat last edit command
u, U Undo last edit, restore current line
J Join two lines
ex edit
commands
:d Delete lines
:m Move lines
:co or :t Copy lines
:.,$d Delete from current line to end of file
:30,60m0 Move lines 30 through 60 to top of file
Copy from current line through line containing pattern to end of
:.,/pattern/co$
file
Exit Commands
Command Meaning
ZZ Write (save) and quit file
:x Write (save) and quit file
:wq Write (save) and quit file
:w Write (save) file
:w! Write (save) file, overriding protection
:30,60w newfile Write from line 30 through line 60 as newfile
:30,60w>> file Write from line 30 through line 60 and append to file
:w %.new Write current buffer named file as file.new
:q Quit file
:q! Quit file, overriding protection
Q Quit vi and invoke ex
:e file2 Edit file2 without leaving vi
:n Edit next file
:e! Return to version of current file at time of last write (save)
:e # Edit alternate file
:vi Invoke vi from ex
: Invoke one ex command from vi editor
% Current filename (substitutes into ex command line)
# Alternate filename (substitutes into ex command line)
Buffer Names
Command Meaning
"bcommand Do command with buffer b
mx Mark current position with x
'x Move cursor to first character of line marked by x
`x Move cursor to character marked by x
`` Return to exact position of previous mark or context
'' Return to beginning of the line of previous mark or context
Word Abbreviation
:unab abbr
Be careful with abbreviation texts that either end with the abbreviation name or
contain the abbreviation name in the middle.
:map x sequence
Define character(s) x as a sequence of editing commands.
:unmap x
:map
:map! x sequence
:unmap! x
For both command and input mode maps, the map name x can take several forms:
One Character
When you type the character, vi executes the associated sequence of commands.
Multiple Characters
All the characters must be txped within one second. The value of notimeout
changes the behaviour.
To enter characters such as Escape (^]) or carriage return (^M) first type a CTRL-
V (^V).
Executable Buffers
Named buffers provide yet another way to create "macros" - complex command
sequences you can repeat with a few keystrokes. Here's how it's done:
Some versions treat * identically to @ when used from the ex command line. In
addition, if the buffer character supplied after the @ or * commands is *, the
command is taken from the default (unnamed) buffer.
Automatic Indentation
:set autoindent
:[addr1][,addr2]s/old/new/[flags]
Omitting the search pattern (:s//replacement/) uses the last search or substitution
regular expression.
An empty replacement part (:s/pattern//) "replaces" the matched text with nothing,
effectively deleting it from the line.
Substitution flags
Flag Meaning
c Confirm each substitution
g Change all occurences of old to new on each line (globally)
p Print the line after the change is made
It's often useful to combine the substitute command with the ex global command,
:g:
vi Regular Expressions
. Matches any single character except newline. Remember that spaces are
treated as characters.
* Matches zero of more (as many as there are) of the single character that
immediately precedes it. The * can follow a metacharacter, such as . or a
range in brackets.
^ When used at the start of a regular expression, ^ requires that the following
regular expression be found at the beginning of the line. When not at the
beginning of a regular expression, ^ stands for itself.
$ When used at the end of a regular expression, $ requires that the following
regular expression be found at the end of the line. When not at the end of a
regular expression, ^ stands for itself.
\ Treats the following character as an ordinary character. (Use \\ to get a literal
backslash.)
[] Matches any one of the characters enclosed between the brackets. A range of
consecutive characters can be specified by separating the first and last
characters in the range with a hyphen..
You can include more than one range inside brackets and specify a mix of
ranges and separate characters.
Most metacharacters lose their special meaning inside brackets, so you don't
need to escape them if you want to use them as ordinary characters. Within
brackets, the three metacharacters you still need to escape are \ - ]. (The
hypen (-) acquires meaning as a range specifier; to use an actual hypen, you
can also place it as the first character inside brackets.)
A caret (^) has special meaning only when it's the first character inside
brackets, but in this case, the meaning differs from that of the normal ^
metacharacter. As the first character within brackets, a ^ reverses their sense:
the brackets match any one character not in the list. For example, [^a-z]
matches any character that is not a lowercase letter.
\( \) Saves the pattern enclosed between \( and \) into a special holding space or
"hold buffer". up to nine patterns can be saved in this way on a single line.
You can also use the \n notation within a search or substitute string:
:s/\(abcd\)\1/alphabet-soup/
* This works with vi, nvi, and vim, but not with elvis 2.0 , vile 7.4, or vile 8.0.
\< \> Matches characters at the beginning (\<) or end (\>) of a word. The end or
beginning of a word determined either by a punctuation mark or by a space.
Unlike \(...\), these don't have to be used in matched pairs.
~ Matches whatever regular expression was used in the last search.
Character classes
Collating symbols
Equivalence classes
An equivalence class lists a set of characters that should be considered equivalent,
such as e and è. It consists of a named element from the locale, bracketed by [=
and =].
All three contructs must appear inside square brackets of a bracket expression.
\n Is replaced with the text matched by the nth pattern previously saved by
\( and \), where n is a number from 1 to 9, and previously saved patterns
(kept in hold buffers) are counted from the left on the line.
\ Treats the following special characters as an ordinary character. To
specify a real backslash, type two in a row (\\).
& Is replaced with the entire text matched by the search pattern when used
in a replacement string. This is useful when you want to avoid retyping
text.
~ The string found is replaced with the replacement text specified in the
last substitute command. This is useful for repeating an edit.
\u or \l Changes the next character in the replacement string to upper- or
lowercase, respectively.
\U or \L, \U and \L are similar to \u or \l, but all following characters are converted
\e or \E to upper- or lowercase until the end of the replacement string or until \e
or \E is reached. If there is no \e or \E, all characters of the replacement
text affected by the \U or \L.
5. ex Commands
Command Syntax
:[address]command[options]
Address Symbols
Address Inlcudes
1,$ All lines in the file
x,y Lines x through y
x;y Lines x through y, with current line reset to x
0 Top of the file
. Current line
n Absolute line number n
$ Last line
% All lines; same as 1,$
x-n n lines before x
x+n n lines after x
-[n] One or n lines previous
+[n] One or n lines ahead
'x Line marked with x
'' Previous mark
/pat/ or Ahead or back to line where pat matches
?pat?
Command Option Symbols
Symbol Meaning
! A variant form of the command
count Repeat the command count times
file Filename: % is current file, # is previous file
Initialization
The .exrc files are simple scripts of ex commands; they don't need a leading colon.
You can put comments in your scripts by starting a line with a double quote (").
This is recommended.
Recovery
The commands ex -r or vi -r list any files you can recover. You then use the
command:
$ vi -r file
Even without a crash, you can force the system to preserve your buffer by using
the command :pre (preserve).
7. vi Options
vitutor tutorial
vilearn tutorial
Using the VI editor other VI manuals/tutorials
frequently asked questions
(the very basics)
2-page PDF summary
The VI editor is a screen-based text editor available on all Unix computers (and available
for all other kinds of computers, sometimes as ``vim'' rather than ``vi''). Given that it
takes some effort, why bother to learn VI? Because
If you will be using Unix/Linux computers, especially via ssh, save yourself headaches
and learn the basics of VI now! This web page (and the 2-page PDF summary) are for
reference; for a hands-on tutorial type the Unix command ``vitutor'' or ``vilearn'', or
try the hyperlinks at the top of this page.
In the following, ^X denotes a control character. For example, ``^D'' means to hold down
the Control key and press the ``d'' key. Also ``Rtn'' means to press the Return (or Enter)
key, while ``Esc'' means to press the Escape key, located in the far upper left corner of the
keyboard.
1. Starting: To edit a file named (say) ``mytext'' on a Unix computer, type the
command ``vi mytext''. Note that you must type the command with lowercase letters.
2. Two Modes: Pay attention, this is the crucial feature of VI! There are two
modes, command and insert. When in insert mode, everything you type appears in the
document at the place where the blinking cursor is. When in command mode,
keystrokes perform special functions rather than actually inserting text to the document.
(This makes up for the lack of mouse, menus, etc.!) You must know which keystroke
will switch you from one mode to the other:
• Switch to insert mode: press i (or a, or o)
• Switch to command mode: press Esc
3. Getting out: When you want to get out of the editor, switch to command mode
(press Esc) if necessary, then
i just before the current cursor position I at the beginning of the current line
a just after the current cursor position A at the end of the current line
o into a new line below current cursor O into a new line above current cursor
6. Cutting, Copying, Pasting: From command mode, use these keystroke (or
keystroke-combination) commands for the described cut/copy/paste function:
• /wavelet Rtn jump forward to the next occurrence of the string ``wavelet''
• ?wavelet Rtn jump backward to the previous occurrence of the string
``wavelet''
• n repeat the last search given by ``/'' or ``?''
8. Replacing Text: This amounts to combining two steps; deleting, then inserting
text.
9. Miscellany: The commands on these two pages are just the start. Many more
powerful commands exist in VI, especially those which invoke other Unix text-filtering
commands (sort, fmt, uniq, cat, sed, awk, grep, etc.). More complete descriptions of all
the possible commands are available on the web; see the list of VI manuals/tutorials
maintained at The Vi Lovers Home Page or use a generic web search to search for ``vi
tutorial'' or ``vim tutorial''.