Vi Primer for Network Engineers

Vi is arguably the best text editing software in the world. There, I said it… deal with it! It should be noted that while many people continue to refer to Vi simply as such, Vim (Vi improved) has been the standard since around 1998. Vi? Old and busted. Vim? New hotness. Vi isn’t an editor designed to hold its users’ hands. It is a tool, the use of which must be learned. It isn’t a word processor. Although it can display text with various forms of highlighting and formatting. If you just had to use Vi to edit a file, there would only be a couple commands you would have to remember.. But that wouldn’t be enough, I hope to give you a basis to realize the true potential of the software, enough to encourage you to buy a book, or search for more tutorials to supplement your new found knowledge.

The Basics

Before we cover a larger list of commands, I want to show you the basics. Vi is a modal editor, it operates in either insert mode or normal mode, where you can insert commands. For example, typing i while in normal mode switches the editor to insert mode, but typing i again at this point places an “i” character in the document. From insert mode, pressing the escape key switches the editor back to normal mode. In normal mode you can quit using :q or if you’ve made changes you wish to save :wq or if you do not wish to save the changes :q! — while these commands will get you buy, but in order to really get vi — you have to experience a bit more…

Cursor Movements

It may seem a bit silly to learn to use the cursor like this when you can simply use the arrow keys, or page up/down.. but these commands can be combined with others to make them more powerful.

  • h – left one character
  • l – right one character
  • j – down one line
  • k – up one line
  • w – right one word
  • b – back one word
  • $ – to the end of line
  • 0 – to the beginning of the line
  • ) – right one sentence
  • ( – left one sentence
  • } – right one paragraph
  • { – left one paragraph
  • <Ctrl>+F – forward one page
  • <Ctrl>+B – back one page
  • G – go to (without arguments, go to end of file)

Deleting

As I mentioned above, some of these commands use d+cursor movement to accomplish rapid editing. For example dw deletes the next word, d+w for delete + right one word.

  • d$ or D – delete to end of line
  • d0 – delete to the beginning of the line
  • d} – delete to the end of paragraph
  • dd – delete delete (delete the whole line)
  • dw – deletes a word
  • db – deletes the word to the left
  • dd – deletes the entire line
  • x – delete character cursor is on

Text Input / Change

All of these commands also require “Esc” to return to Normal mode.

  • i – insert text before the character cursor is on
  • I – insert text at the beginning of the line
  • a – append (insert text after the character cursor is on)
  • A – append text to the end of the line
  • cw – change the current word
  • cb – change backwards
  • C or c$ – change from the cursor to the end of the current line
  • R – start overwriting text
  • o – start entering text at the beginning of the new line below the cursor
  • O – start entering text at the beginning of the new line above the cursor

Other Basic Commands

  • r – replace one character – can also be used with “cursor commands”
  • ZZ – save and exit (hold down shift and press “z” twice)
  • yy – yank line cursor is on
  • p – paste below cursor line (deleted or copied text)
  • P – paste above cursor line
  • u – undo last editing command
  • U – undo all changes
  • . (period) – Repeat the last text changing command
  • J – Join, combines the current line, and the next line into one.

Advanced Functions

Any command can take numeric argument to run a command multiple times.

  • 5dd – delete 5 lines beginning with cursor line
  • 2dw – delete two words
  • c3w – change 3 words, this can also be run as above.. 3cw
  • 3<Ctrl>+B – move up three pages
  • 1G – go to the first line

Misc Manipulation

These commands are handy for making rapid changes.

  • ~ – Change case of individual character
  • <Ctrl>+a – Increment number under the cursor
  • <Ctrl>-x – Decrement number under the cursor

Search and Replace

What text editor would be complete without having search / replace functionality!? Vi includes an advanced search / replace feature set that supports regex.

  • /search_string – Search for search_string
  • ?search_string – Search backwards (up in file) for search_string
  • n – Find next occurrence
  • N – Find previous occurrence
  • :s/pattern/string/flags – Replace pattern with string according to flags. (This is done in ex mode)
  • g – Flag – Replace all occurences of pattern
  • c – Flag – Confirm replaces
  • & – Repeat last :s command

Ex Mode

Execute mode has more functionality than I could include in several blog posts. These are some basic examples of usage.

  • : – enter ex mode
  • :18,24 del – delete from line 18 to line 24
  • :23,48 copy 17 – block from line 23 to 48 copy to line 17
  • :2,17 move 92 – block from line 2 to 17 move to line 92
  • :r somefile – read in “somefile”
  • :wq – write and quit (same as above)
  • :w – write (save) if the file permissions allow it
  • :w! – save file even if it is read-only as long as we own it
  • :w somefile – save this file as “somefile”
  • :q – quit without saving
  • :q! – quit without saving if changes were made

Map / Macro

A map allows you to define strings of commands. When defining a map it is helpful to take advantage of the unused keys in vi (K V g q v * = F1-F12), you also need to be mindful of any special characters such as Esc, Enter, Tab, or any Ctrl characters, use a +v before each special character.

An example of setting up a map would be :map v /I +v cwWe +v which would search for the letter “I” and replace it (using change word) with “We” when the v key is pressed.

  • :map – Displays all created macros on status line
  • :unmap key – Removes macro definition for key
  • :ab – Displays all abbreviations
  • :ab str string – When str is input, replaces it with string
  • :una str – Unabbreviates str
  • q[lower case letter] – Start/Stop recording a Macro
  • @[lower case letter] – “Play” recorded macro
  • 10@[lower case letter] – “Play” recorded macro 10x

Fun Tricks

I’ve compiled a list of useful tips to pique your interest.

Revese lines on buffer

This command will reverse all lines in the current buffer. This is really handy when you’re working on ACLs on an ASA. (Removing them in reverse) — :g/^/m0 Broken down, this operates using the following commands…

  • : – start ex / command-line mode
  • g – means you’ll take an action on any lines where a regular expression matches
  • / – begins the regular expression (could have used any valid delimiter)
  • ^ – matches the start of a line (which matches all lines in the buffer)
  • the second / ends the regular expression (the rest is an Ex command to execute on all matched lines)
  • m – means move
  • 0 – is the destination line number (beginning)

If you do not want to reverse the entire file, you can supply the range of lines to reverse to the command and adjust the destination accordingly. For example, to reverse only lines 100-150:

  • :100,150g/^/m99

Shift a block of code left or right

Enter visual mode by typing the letter “v” at the top (or bottom) of a block of text, move the cursor to the bottom (or top) of the block of text. Using > or < you can now shift the text 1 tab right or left.

Strip blanks at end of line

  • :%s/\s\+$//

Delete all lines beginning with or matching a pattern

  • :1,$ /^#/d – Delete all (first to last line: 1,$ or g) comments lines in file. Delete all lines beginning (^) with “#” (specify text pattern).
  • :g/#/d – Delete all lines (g) containing comments (comments follow “#”) in file. Delete all lines containing “#”.
  • :g!/^#/d – Delete all lines except (g! or v) comment lines beginning (^) with “#”.

Strip DOS ^M

  • :1,$ s/<Ctrl>+V<Ctrl>+M//

Editor Customization

What text editor would be complete without an endless sea of options!? I’ve highlighted a few here that may come in handy. Obvious there are many many others, but these are the ones I use regularly.

  • :set all – Shows the state of all options
  • :set nu (number) – Displays the screen numbers of all lines – Disabled using :set nonu
  • :set ai – Turns on auto indentation – Disabled using :set noai
  • :set eb – Precedes error messages with a bell – Disabled using :set noeb
  • :set ic – Ignores case when searching – Disabled using :set noic
  • :set sm – Indicates input or replace mode at bottom – Disabled using :set nosm

Conclusions

While I understand that this is a large amount of data to absorb, I sincerely hope that I’ve given you not only enough information to interest you in learning Vi, but also enough of a reference to use as you start learning. The only downside I’ve ever really thought about, is not having it during those critical hours during your lab.

Tony Mattke
Tony Mattke is a network engineer currently serving the enterprise data center market. In the past he has worked for ISPs, Data Centers, and even started his own consulting practice. Tony is a bit of a nut, who enjoys collecting tidbits of knowledge about far too many topics, and talking about himself in the third person. You can find his networking blog at RouterJockey.com or contact him on twitter via @tonhe.
Tony Mattke

Latest posts by Tony Mattke (see all)

  • alifaan

    wow, great post! I can finally learn vi and replace nano. 

  • http://twitter.com/chrismarget chris marget

    “not having it during those critical hours during your lab”
    +1

    The idea of being stuck with notepad is terrifying!

  • Dave Noonan

    Great post.  I’ve always found Vi easier than the alternatives.  Probably because I learned it first and I’m a little warped.

    Another command that I find handy is “:set nowrap” to turn off line wrapping.

  • http://twitter.com/MrsYisWhy Mrs. Y.

    Very good cheat sheet. However, the dos2unix command will strip off those pesky ^M characters very quickly without having to enter an editor.

  • http://twitter.com/paulgear1 Paul Gear

    My favourite search: /^[^#]

    What it does: Searches for all lines not beginning with a comment.

    Mods: If you’re working with Samba configs, add ; after the #.  If you’re working with switch configs via RANCID, add ! after the #.

  • http://twitter.com/JTIE_6EE7 JT

    Type in “vimtutor” at your CLI for a great walk-through of vi with plenty of exercises.

  • tonhe

    I wanted to add a little help here for those maybe looking to go a little deeper… I’m adding links here to my gvimrc files for both Windows and Mac, both of which support auto-magic copying of text when selected (very handy) and on the windows side, I also have the setup for Ctrl+c / Ctrl+v Copy / Paste. Most of the options I use are rather simple, although some people use rather complex configurations.

    There are instructions on where to place the files on each copy. If you have any questions, let me know.

    http://routerjockey.com/tmp/gvimrc-mac
    http://routerjockey.com/tmp/gvimrc-win

  • Ian Bowers

    You’ll know you’re sufficiently versed int vi when you’re on a bash or ios command line, and you mash “x” a bunch of times in the middle of a line trying to delete characters.