How to use the VI Editor

By jldurham6,

  Filed under: Linux
  Comments: None

VI Helpfile

written in the vi editor
Helpfile for learning the vi editor.
This is not intended to be a tutorial, rather as a quick reference of vi and ex commands. Lynx version here

Part I/a is an explanation of the syntax of vi commands.

Part I/b is the quick help and covers some of the important(in my mind) vi commands, and command combinations.
Part I/c is a listing of all the vi commands and their function.
Part II/a is the syntax of how addresses work in ex.
Part II/b is a quick list of almost all of the ex commands and their abbreviations.
Part II/c is a listing of almost all of the standard ex commands and their function.
Part III is a quick explanation of regular expressions as they are used in vi/ex.

vi has basically three modes
1) command or normal mode
2) insert or input or append mode
3) ex or command-line mode.
vi starts in command mode where you can issue commands, move and/or cut/copy/modify text. The : (colon) puts you in ex mode where you can use powerful ex commands like gsv! etc. certain commands will put you in insert mode, eg. iIaAoO. When in insert mode you can type in text. R will put you in a special case of insert mode, that is overwrite mode. ^[ (escape key) will put you back in command mode when you are in insert mode.

Back to top
(Part I/a)

SYNTAX OF VI COMMANDS

Most commands in vi have the following form
[n] operator

 

Examples
5x delete 5 characters
3fG forward to third G on line
2tO forward to character before second O on line
3Tc backward to after the third c
20j move cursor down 20 lines
5H move cursor 5 lines from top of screen
5rx replace next 5 characters with x
5$ move to end of 5th line down (line 1 is current)

Editing commands (cdy><!) have the following form
[n] operator [m] object
An object in vi would be a character or a word or a line or a sentence etc. Basic operators for editing are

c begin a change
d begin a delete
y begin a yank

If the current line is the object of the operator then the object is the same as the operator: ccddyy.
If both n and m are specified the effect is n * m, that is n multiplied by m.

Examples
cw change word
c$ change to end of current line
5dd delete next five lines
d5G delete to line 5
dG delete to end of file
de delete to end of word
d^ delete to beginning of current line
yy yank current line
y’z yank to line marked with z
yL yank to bottom of screen

Commands in vi are not echoed to the screen except the following.
These are echoed on the status line.

/ search forward for pattern
? search backward for pattern
: invoke an ex command
! invoke a unix (OS) command that takes as its input an object in the buffer, and replaces it with output from the command

The above commands are completed by pressing the return key. A buffer in vi would refer to the file as it’s kept in memory <>, and ! can also be combined with a movement command like cd, and y

Examples
>> indent current line one shiftwidth
5<< outdent 5 lines starting with current
/hello search forward for word ‘hello’

Back to top
(Part I/b)

QUICK HELP

( commands and command combinations to get you started in vi )

 

MOVEMENT
by character
h cursor left
j cursor down
k cursor up
l cursor right
space cursor right
by line
[n]G to line n
0, $ first, last position on line
+, – first character on next, previous line
^, _ first character on current line (other than tab or space)
by screen
^F, ^B scroll forward, backward one screen
^D, ^U scroll forward, backward half screen
^E, ^Y show one more line at bottom, top of screen
z<enter> position line with cursor at top of screen
z. position line with cursor at middle of screen
z- position line with cursor at bottom of screen
marking position on screen
mz mark current position with z
`z move cursor to mark z
‘z move cursor to first non-whitespace character on line containing mark z
miscellaneous movement
fG forward to character G
Fd backward to character d
tg forward to character before g
Tw backward to character after w
w beginning of next word
W beginning of next WORD (punctuation is part of word)
b back one word
B back one WORD (punctuation is part of word)
e end of word
E end of WORD (punctuation is part of word)
), ( next, previous sentence
]], [[ next, previous section
}, { next, previous paragraph
( this will depend on your settings for what constitutes a “section” and “paragraph” )

 

EDITING TEXT
inserting text
a append after cursor
A append at end of line (same as $a)
i insert before cursor
I insert at beginning of line (same as _i)
o open line below cursor
O open line above cursor
^[ terminate insert mode (escape)

Back to top
(Part I/c)

VI COMMAND KEYS IN ALPHABETICAL ORDER

( ^A stands for <control-A> ) If there is an X in the count column then the command can be preceded by a number and the command then is executed count times. If the command is an editing command such as a or i, then you’ll have to hit escape for the execution to happen count times. See example in Part I/a.
A word consists of [a-zA-Z_] and a WORD consists of previous plus punctuation, basically delimited by whitespace.

 

Count Command Action
X a append after cursor
X A append at end of line (same as $a)
^A unused
X b back up one word
X B back up one WORD
X ^B scroll up one screen
X c begin a change (combine with movement command)
X C change line from cursor to end of line (same as c$)
^C abort current ex command;
in insert mode : end insert mode
X d begin a delete (combine with movement command)
X D delete from cursor to end of line (same as d$)
X ^D scroll down a half screen;
in insert mode : back up one shiftwidth
X e goto end of word
X E goto end of WORD
X ^E show one more line at bottom of screen
X f forward to next typed character
X F backward to next typed character
X ^F scroll down one screen
g unused
X G goto count line; default is end of file
^G print file info on status line (bottom of screen)
X h cursor left
X H goto top of screen;
count will place you that many lines from top of screen
X ^H cursor left;
in insert mode : backspace
X i insert before cursor
X I insert at beginning of line (same as _i)
^I unused;
in insert mode : tab key
X j cursor down
X J join two lines
X ^J cursor down;
in insert mode : same as enter
X k cursor up
K unused
^K unused
X l cursor right
X L goto bottom of screen;
count will place you that many lines from bottom of screen
^L redraw screen, usually
m mark current cursor position with character typed (a-z)
M goto middle of screen
X ^M goto first character on next line;
in insert mode : same as enter key
n repeat last search command
N repeat last search command in reverse direction
X ^N cursor down
X o open a new line below the cursor
X O open a new line above the cursor
^O unused
X p put yanked or deleted text after or below cursor
X P put yanked or deleted text before or above cursor
X ^P cursor up
q unused
Q quit vi, invoke ex (not very useful) return with vi
^Q unused (some terminals, stop data flow)
X r change character under cursor to character typed
X R replace characters (overwrite mode)
^R redraw screen, usually
X s substitute characters under cursor to ones typed
X S substitute entire line
^S unused (on some terminals, resume data flow)
X t forward to before next character typed
X T backward to after next character typed
^T goto previous tag;
in insert mode : move right one shiftwidth
u undo last change
U restore current line
X ^U scroll screen up a half screen;
in insert mode : delete back to start of insert (depends on terminal settings)
v unused
V unused
^V unused;
in insert mode : quote next character
X w forward one word
X W forward one WORD
^W unused;
in insert mode : back up to beginning of word (depends on terminal settings)
X x delete character under cursor
X X delete back one character
^X unused
X y begin a yank (combine with movement command)
X Y yank current line (same as yy) (map it to y$ to be consistent with D and C)
X ^Y show one more line at top of screen
z<enter> 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
ZZ quit vi, write file if changes were made
^Z suspend vi on systems that have job control (depends on terminal settings)
^@ unused
^[ terminate insert mode (escape key)
^\ unused?
^] goto tag under cursor
^^ edit alternate file
^_ unused?
^? unused? delete key?
X space cursor right
! filter program through external filter, requires an object to work on
(combine with movement command) (press enter to execute)
use register for next delete, yank or put, registers are (a-zA-Z0-9)
# unused?
X $ goto end of line
% goto matching bracket () [] {}
& repeat last substitute
to first non-blank character on line with mark (a-z)
X ( beginning of next sentence
X ) beginning of current sentence
(sentence is delimited by ., !, ? and followed by at least one space)
* unused?
X + down one line to first non-blank character (j_)
X , repeat f, F, t, T commands in reverse direction
X up one line to first non-blank character (k_)
. repeat previous command
/ search forward for text entered
(repeat previous search if no argument supplied) (press enter to execute)
0 goto beginning of line
: enter an ex command (press enter to execute)
X ; repeat f, F, t, T commands
X < begin a shift left (combine with movement command)
= unused
(unless in lisp mode in which case it formats to standard lisp formatting)
X > begin a shift right
? search backward for text entered
(repeat previous search backward if no argument supplied) (press enter to execute)
@ execute a register (0-9a-z”.)
X [[ beginning of current section (as delimited by the sect= option)
\ unused
X ]] beginning of next section (as delimited by the sect= option)
^ goto first non-blank character on line
X _ goto first non-blank character on line
` goto mark (a-z)
X { beginning of current paragraph
(as delimited by a blank line or the para= option)
X | goto count column, default is beginning of line
X } beginning of next paragraph (as delimited by a blank line or the para= option)
X ~ change case of character under cursor

Most vi commands can be remapped. Here are some good ones.
map ^N :n^M
map ^P :rew^M
map Y y$
map ^K :q!^M
map g 1G
Control characters will have to be quoted with ^V, that is <control-V>

Back to top
(Part II/a)

EX EDITOR

 

ADDRESS SYMBOLS
0 beginning of file
$ end of file
1,$ all lines in file
% stands for filename, hence it means the entire file (1,$)
# stands for alternate file
x,y lines x through y
x;y lines x through y, current line reset to x
. current line
n absolute line number n
x-n n lines before x
x+n n lines after x
+[n] n lines ahead (default is one)
-[n] n lines back (default is one)
‘x line marked with x
previous mark (that’s two single quotes)
/pattern/ forward to line matching pattern
?pattern? backward to line matching pattern

Back to top
(Part II/b)

QUICK LIST OF EX COMMANDS AND THEIR ABBREVIATIONS

 

 | abbreviate ab | move m | tag ta | | append a | next n | unabbreviate una | | args ar | number # nu | undo u | | change c | open o | unmap unm | | chdir cd chd | preserve pre | version ve | | copy t co | print p | visual vi | | delete d | put pu | write w | | edit e | quit q | xit x | | file f | read r | yank ya | | global g v | recover rec | (window) z | | insert i | rewind rew | (escape to OS) ! | | join j | set se | (lshift) < | | list l | shell sh | (rshift) > | | map | source so | (line number) = | | mark k ma | substitute s & ~ | (execute buffer) * @ | 

Back to top
(Part II/c)

EX COMMANDS

( anything in [] is optional , anything in {} is the rest of the name of the command which is also optional )
The default for address is the current line, except for gg! , vw; for these the default is the entire file.

ab{breviate} [word text]

    define string when typed to be translated into text.
    if string and text not specified, list all abbreviations
    abbreviations are usually put into your .exrc file
    eg. :ab Xvi vi is the best editor
        :ab charcater character
        :ab teh the
        :ab hvae have

[address[,address]]a{ppend}[!]
text
.

    append text at address. ! switches autoindent.

ar{gs}

    print filename arguments.

cd [path]

    without path change to home directory, with path change to path

[address[,address]]c{hange}[!]
text
.

    replace lines with text. ! switches autoindent.

[address[,address]]co{py}destination

    copy lines from address to destination.
    eg. :1,10co50      copy lines 1 to to 10 to below line 50

[address[,address]]d{elete} [buffer][count]

    delete lines in address, if buffer is specified save lines to buffer.
    count specifies the number of lines to delete starting with address.
    eg. :/include/,/main/d      delete lines between include and main
                                including include and main
        :/include/+,/main/-d    as above but not including include nor main
        :3d     delete line 3
        :d3     delete 3 lines starting with current
        :.,$d a delete to end of file from current line into buffer a
        :d a3   delete next three lines starting with current into buffer a

 

e{dit}[!] [+n] [file]
    begin editing file. ! will discard changes to current file.
    n specifies line to begin editing file (default 1).
    eg. :e file     edit file
        :e #        edit previous file

f{ile} [filename]

    change name of file to filename. without argument print current
    filename.
    eg. :f %.new    appends .new to current filename, renaming file to
                    file.new

[address[,address]]g{lobal}[!]/pattern/[commands]

    execute commands on lines that contain pattern, if address is specified
    within the address range. ! execute on lines not containing pattern.
    without commands print matching lines.
    eg. :g/\#include/d      delete all lines that have include directives
        :g!/\#define/p      print lines that are not define statements
        :g/^\/\*/p          print lines that start with /*
        :g/^[ ^I]*$/d       delete empty lines as well as lines with only tabs
                            or spaces
        :g/strcmp/d5        delete lines that have strcmp in them as well
                            as the following 4 lines

[address[,address]]i{nsert}[!]
text
.

    insert text at line before address. ! switches autoindent.

[address[,address]]j{oin}[!][count]

    join lines in specified range. ! preserves white space. 
    eg. :1,5j!     join lines 1 to 5, preserve white space

[address[,address]]k char

    synonymn for mark, character can follow k with no intervening space.

[address[,address]]l{ist}[count]

    print lines so that tabs show as ^I and end of lines are marked with $.

map[!] [char commands]

    define a keyboard macro for named char that is a synonymn for commands.
    !  will create a mapping for input mode. with no arguments print mapped
    keys.
    eg. :map ^N :n^M    (to get a control character type ^V followed by the
                        control character)

[address[,address]]ma{rk} char

    mark lines with char. char is a single lowercase letter.
    eg. :ma z   mark line with z
        :'z     return to line with mark z

[address[,address]]m{ove} destination

    move lines specified by address to destination.
    eg. :.,/include/m /string/  move lines from current to include line below
                                line with string

n{ext}[!] [[+commands] filelist]

    edit next file from argument list. if filelist is provided, replace
    argument list with filelist. ! will discard changes to current file.

[address[,address]]nu{umber}[count]

    print lines specified by address, precede each line by its line number.
    count specifies the number of lines to print.

[address[,address]]o{pen}[/pattern/]

    enter vi's open mode with lines specified by address, or at lines
    containing pattern.

pre{serve}

    save current buffer as if the system had crashed

[address[,address]]p{rint}[count]

    print lines specified by address. count is the number of lines to print.
    eg. :304;+5p    print five lines starting with 100, reset current line to
                    100

[address[,address]]pu{t} [buffer]

    restore lines that were previously deleted or yanked and put them after
    current line. put line from buffer if specified.

q{uit}[!]

    quit. ! discard changes to file.

[address[,address]]r{ead} file

    copy text from file on line below specified by address.
    eg. :0r data    read in file "data" at top of file

[address[,address]]r{ead} !command

    read the output of command into file after line specified by address.
    eg. :$r !ls -aFC    run "ls" and read in its output at end of file

rec{over} [file]

    recover file from system save area.

rew{ind}[!]

    rewind argument list to first argument. ! discards changes to current
    file.

se{t} parm1 parm2

    set value to an option with each parm. if no parm is supplied print all
    changed options. for boolean options parm is phrased as option or
    nooption, other options are option=value. all will print all available
    options.
    set commands are usually put into your .exrc
    eg. :se autowrite tabstop=4 autoindent shiftwidth=4 wrapmargin=5
        :se all     print all available options

sh{ell}

    create a new shell. resume editing when shell exits.

so{urce} file

    read and execute ex commands from file
    eg. so ~/old.exrc

[address[,address]]s{ubstitute}[/pattern/replacement/][options][count]

    replace pattern with replacement. if pattern and replacement are omitted
    repeat last substitution. count specifies the number of lines on which to
    substitute starting with address.
    options
    c   prompt for confirmation
    g   substitute all instances on line
    p   print last line on which substitution was made
    eg. :%s/[hH]ello/Hi/g       replace hello or Hello with hi, all ocurrences
        :.,$s/[uU][nN][iI][xX]/\U&/10   upcase unix on next 10 lines
        :%s/\<./\u&/g    turn the first letter of all words to uppercase
        :1,/main/s/int/long/g   substitute occurances of int before main with
                                long

[address[,address]]t destination

    synonymn for copy

ta{g} tag

    switch to file containing tag.
    eg. :!ctags *.c     run ctags on all .c files in directory
        :ta func        switch to file containing func, put cursor on it

una{bbreviate} word

    remove word from list of abbreviations.

u{ndo}

    undo changes made by last editing command.

unm{ap}[!] char

    remove char from keyboard macros. ! remove macros for input mode.

[address[,address]]v/pattern/[commands]

    synonymn for global!
    eg. :v/./,/./-j     join empty lines to have only single empty line
                        between lines of text

ve{rsion}

    version of editor.

[address[,address]]vi [type][count]

    enter visual mode at line specified by address. exit with Q. count
    specifies initial window size.
    -   place line at bottom of window
    .   place line in center of window
    ^   print previous window

vi [+n] file

    begin editing file in visual mode at line n.

[address[,address]]w{rite}[!] [[>>] file]

    write lines specified by address to file. >> is used to append to file.
    with no address write all of the file. ! forces the write.
    eg. :1,25w new_file     write lines 1 to 25 to "new_file"
        :50,$w >> new_file  append line 50 to end of file to new_file

[address[,address]]w !command

    write lines specified by address to command.

wq[!]

    write lines specified by address to file and quit. ! forces the write

x{it}

    exit file. save changes.

[address[,address]]ya{nk} [buffer][count]

    place lines specified by address in buffer char. count is the number of
    lines to yank starting with address.
    eg. :20,100ya z     yank lines 20 to 100 into buffer z

[address[,address]]z[type][count]

    print a window of text. count is the number of lines to display starting
    with address.
    type
    +   place line at top of window(default)
    -   place line at bottom of window
    .   place line in center of window
    ^   print previous window
    =   place line in center of window. leave line as current line.

[address[,address]]![command]

    execute command. if address is specified apply lines from address as input
    to command, and replace lines with output.
    eg. :!ls -aFC           run ls, will not read output into file
        :0!ls -aFC          run ls, read in its output to beginning of file
        :11,35!sort -fd     sort lines from 11 to 35
        :%!spell -b         run the spellchecker on entire file

[address[,address]]=

    print line number of matching address. with no address print line number
    of last line.

[address[,address]]<[count]
[address[,address]]>[count]

    shitft lines left(<) or right(>). count specifies the number of lines to
    shift starting with address.
    eg. :1,9>   indent lines 1 through 9 one shiftwidth

address

    print line specified by address.

return

    print next line.

[address[,address]]&[options][count]

    repeat previous substitution. count specifies the number of lines to
    substitute on starting with address.
    eg. :s/msdos/UNIX   substitute msdos with UNIX
        :g/OS/&         redo substitutions on all lines with "OS"

[address[,address]]~[count]

    replace previous regular expression with the previous replacement from
    substitute.

*[buffer]
@[buffer]

    execute named buffer

[address[,address]]#[count]

    synonym for number

The following can be used as addresses in ex, as well as in commands :g:s:v, and in the vi commands ?, and /

Back to top
(Part III)

REGULAR EXPRESSION SEARCH AND SUBSTITUTE

 

SPECIAL CHARACTERS
. match any single character except newline
* match any number (including none) of the single atom immediately preceding
^ match beginning of line if at start of expression
$ match end of line if at end of expression
[] match anything enclosed in [], called a character class
[^] match anything not enclosed in []
\( \) store pattern for later replay
\< match following characters at beginning of word
\> match preceding characters at end of word
\ escape character following (needed for eg. \. to match a .)
\n reuse previous pattern, n is a number between 1 and 9 eg. \1
& reuse previous search pattern
~ reuse previous replacement pattern
\u change character to upper case
\U change characters to upper case
\l change character to lower case
\L change characters to lower case
\e turn off previous \u or \l
\E turn off previous \U or \L

 

EXAMPLES
Perl matches Perl
^Perl matches Perl at beginning of line
Perl$ matches Perl at end of line
^Perl$ matches Perl as the only word on line
^$ matches the empty line
^..*$ matches a line with at least one character
.* matches any string of characters including none
^[ ^I]*$ as above but line can also contain spaces and/or tabs(^I)
[pP]erl matches perl or Perl
[aA][nN] matches an, aN, An, AN
p[aeiou]g second letter is a vowel
i[^aeiou]g second letter is not a vowel
p.g second letter is anything
^….$ matches a line with exactly four characters
^\. matches any line beginning with a dot
^\.[0-9a-z] same with a lowercase letter or digit following
^[^\.] matches any line that does not begin with a dot
;$ matches a line ending with a semicolon
figs* matches fig, figs, figss, figsss etc.
[a-z][a-z]* matches one or more lowercase letters
[a-zA-Z] matches any character
[^0-9a-zA-Z] matches any symbol (not a letter or number)
\<the matches the, theater, then
the\> matches the, breathe
\<the\> matches the
:%s/\<./\u&/g turn the first letter of all words to uppercase
:%s/\<[a-z][!-~]*\>/\u&/g as above
:%s/\<[a-z]/\u&/g as above
:%s/.*/\L&/ turn entire file to lowercase
:%s/<[^>]*>//g remove strings from file that start with a less than sign and end with a greater than sign (html tags)
.^&$ must be preceded by a \ to make literal when magic is on. * must be preceded by a \ under certain circumstances although it never hurts to precede it with a backslash whenever you mean a * not its regexp meaning. % and # should also be escaped as they mean current and alternate file to ex. Regular expressions only work in a s/pattern/replacement/ for the pattern and not the replacement, for obvious reasons.

Originally this file was turned into HTML format by Karlon West.
I updated it and fixed some errors. This helpfile is based on a helpfile that I wrote (with the help of various man pages from Linux, BSD, DEC Unix, HP-UX) in text format in 1995.
Please e-mail me if you find any errors.
~
~
~
~
“vi.html” 1798L, 48182C