## Be familiar with the vi(1) editor ##

[Author](authors.html): Fred Crowson <openbsd@crowsons.net> OpenBSD

[Reviewer](technical_reviewers.html): _name_ _[[contact]]_ _[[BSD_flavour]]_

[Reviewer](technical_reviewers.html): Jacob Alexander Swenson <jacob@infosec1.com> FreeBSD

----



### Concept ###

The default editor on BSD systems is often vi(1) and many system utilities
require familiarity with vi(1) commands.
Be able to edit(((editing))) files using this editor, as well as
modify a read-only file or exit vi(1) without saving any edits to
the file.


### Introduction ###

The vi (((vi))) editor is a screen oriented text editor.  ex (((ex))) is a line oriented text editior.  Both ex and vi are different interfaces to the same program.

FreeBSD, NetBSD, OpenBSD and DragonFlyBSD all use the nex/nvi versions of the ex/vi text editors, these are bug-for-bug compatible replacements for the original Fourth Berkeley Software Distribution (4BSD) ex and vi programs.

As stated above vi is a screen editor, in practice this means that it takes almost the entire screen.  The sreen is mainly a display of the lines in a file, except for the last line which is used for you to give commands to vi.  vi is a modeful editor.  This means that you are either entering commands or entering text.  You need to be in the correct mode to do one or the other.

vi commands can be broken down into four types of commands:

1. Command-Line options
1. Movement Commands
1. Editing Commands
1. Exit Commands

To ease the process of familiarisation with vi, it is important to remember that it is a modeful editor.  When starting vi from the command line you are initially in command mode.  In command mode typing on the keyboard issues commands to the editor.  These commands usually one or two characters, such as **i** to insert text or **cw** to change a word. To enter text, you need to be insert (**i**) or append (**a**) mode. To return to command mode you press the _Esc_ key.

To remind you which mode you are in you can use **:set showmode** to tell vi to display on the command line at the bottom of the screen which mode you are in.

#### Command-Line Options ####
(((vi!command-line options)))
The command-line options are those used to invoke the vi editior, such as starting vi to edit a file called filename.  If the file does not exist it will be created, thus if you edit a file with vi and it opens an empty file then chances are you have mistyped the file name.

""$ **vi _filename_**        _This invokes vi on filename_

If you wanted to invoke vi in read-only mode you have two options, either invoke with the -R switch, or use view:

""$ **vi -R _filename_**     _Open filename read-only_

""$ **view _filename_**      _Open filename read-only_

All the switches are documented in the man page.  But two useful switch when invoking vi are + and +n as illustrated below:

""$ **vi + _filename_**      _Open filename at last line_ 

""$ **vi +n _filename_**     _Open filename at line number n_

#### Exit Commands ####
(((vi!exit commands)))
Before dealing with the movement and editing commands we will look at the exit commands, the reason for this is that if you open a file by mistake or wrongly edit a file it is useful to know how to recover the situation.

To that end the first exit command to mention is:

"":q!              _exit vi forcing all edits to be thrown away._

This is important as vi normally tries to save all edits to files.  If you just use :q which is quit file in vi you will be warned if modifications have been made.

"":q               _quit file_

To save the file you use :w and this can be combined with the quit command to write and exit the file:

"":wq             _write (save) and quit file_

The ZZ(((vi!ZZ))) command performs the same function as :wq in that the file is saved, if modified, and then vi quits that file.

If you are in command mode typing i(((vi!i))) or a(((vi!a))) with put you in editing mode.  i inserts text before the cursor and a inserts text after the cursor.  To exit editing mode you just press the _Esc_ key. Once you have started editing a file it is useful to use the showmode command, this will tell you if you are in command or edit mode:

"":set showmode
(((vi!showmode)))
This will put either the words Command, Insert or Append on the right hand 
side of the command line at the bottom of the vi window, and reminding you 
which mode you are in. 

#### Movement Commands ####
(((vi!movement commands)))
vi provides many methods of moving around the file, from character level to moving by screens, and using search to move around the file. 
This section will give a brief overview of the many movement commands that are available in vi.
Character level movement is achieved with:
""**h**    Left
""**j**    Down
""**k**    Up
""**l**    Right

Character level movement can also be achieved using the arrow keys on the keyboard.  Moving around a file at the character level is not always the most efficient method, however you can backwards and forwards through the file by word beginnings and endings:
""**w** or **W**   move forward by word
""**b** or **B**   move backwards by word
""**e** or **E**   move forward to the end of a word

At the line level:
""**0**   first position of current line
""**$**   last position of current line
""**^**   first non-blank character of current line
""**+**   first non-blank character of next line
""**-**   first non-blank character of the previous line

Movement through the file can also be achieved by line numbers, where **Ctrl-G** will display your current line number.
**_n_G** will move you to line _n_, and **G** will move you to the last line of the file.  You can also use the ex command for moving to a particular line by doing **:_n_** where _n_ is the line number to move to.

Before leaving the section on movement around files, another useful way to move around a file is using vi search capabilities.
By typeing **/_pattern_** or **?_pattern_** vi will search forwards (**/**) for **_pattern_** or backwards (**?**) through the file.  Similarly to repeat the previous search just entering **/** for a forward search and **?** for a backwards search.  **n** will repeat a search in the same direction, and **N** will repeat the search in the opposite direction. 

#### Editing Commands ####
(((vi!editing commands)))
vi editing commands cover inserting text, changing text, deleting or moving text and yanking (vi version of copying) text.  **i** and **a** have been mentioned above.  When they are capitalized you get:

""**I** insert text before beginning of line
""**A** insert text after end of line

Changing text can be achieved at the character, word, line and even greater levels. 

""**r**   replace character under cursor
""     e.g. typing rt would replace the character with a 't'
""**cw**  change the word
""**cc**  change current line
""**C**   change to end of line
""**R**   overwrite characters
""**s**   delete character and insert new text
""**S**   delete current line and insert new text

To copy words or lines in vi they are Yanked using:

""**yw**  yank a word
""**yy**  yank current line

Yanked words can then be pasted using:

""**p**  put yanked text after cursor
""**P**  put yanked text before cursor

The deletion commands in vi, can also be used to move text around a file as vi puts the deleted text in a buffer which can then be put elsewhere in the file by using the **p** and **P** commands.

""**dd**  delete current line
""**dw**  delete word
""**x**  delete character under cursor
""**X**  delete character before cursor

Finally there are four other editing commands that are worth a quick mention:

""**.**  repeat the last edit command
""**J**  join two lines together
""**u**  undo last edit
""**U**  restore current line

### Examples ###

""**:w**     write (save) file
""**:wq**    write (save) file and quit
""**:wq!**   write (save) file, quit and ignore warnings
""**q!**     exit vi forcing all edits to be thrown away
""**dd**     delete line under cursor
""**y**      yank line under cursor (save to buffer)
""**p**      put buffer in current cursor position
""**x**      delete character under cursor
""**i**      enter insert mode
""**a**      enter append mode (insert after cursor)
""**/**      enter search mode 
""           **/_pattern_** would search forward for _pattern_
""**:**      enter ex command
""**:r**     read file into current cursor position
""           **:r _filename_** would insert the contents of _filename_ into current file
""**ZZ**     save and exit vi
""**:set number**  display line numbers
""**:set list**    display line end (displays $ at the end of each line)

### Practice Exercises ###

1. Starting the editor

1. Getting out of the editor 

1. Moving around in the file (including Arrow keys)

1. Making simple changes 

1. Writing, quitting, editing new files

### More information ###

vi(1) including: :w, :wq, :wq!, :q!, dd, y, p, x, i, a, /, :, :r,
ZZ, :set number, :set list

ex, Bill Joy. [USD/12.vi](http://docs.freebsd.org/44doc/usd/12.vi/paper.html)

[FreeBSD Manual Page for vi](http://www.freebsd.org/cgi/man.cgi?query=vi)

[NetBSD Manual Page for vi](http://netbsd.gw.com/cgi-bin/man-cgi?vi)

[OpenBSD Manual Page for vi](http://www.openbsd.org/cgi-bin/man.cgi?query=vi)

[DragonFlyBSD Manual Page for vi](http://leaf.dragonflybsd.org/cgi/web-man?command=vi)

Learning the vi Editor by Linda Lamb &amp; Arnold Robbins is a useful text from [O'Reilly](http://www.oreilly.com/catalog/vi6/). 
In addition there are many tutorials available on the internet.

### Vi Security ###

While using the vi editor you can escape to a shell, using **:sh**, or execute comands using **:!** _cmdname_, thus if you allow users to edit configuatation files using sudo, you might well be giving them root access.

### Vi Clones ###
(((vi!clones)))

There are many vi clones that add functionality, such as Vim <http://www.vim.org/> and Elvis <http://elvis.the-little-red-haired-girl.org/>.  The advantage of these clones is that they often have GUI's and run on other OSes so you can use for favourite editor (vi of course ;~D) where ever you go.