Vim Modes

Because Vim is focused on changing existing code just as much as writing new code, it is split into several modes that each have different purposes.

Normal Mode

By default, Vim starts in “normal” mode. Normal mode can be accessed from other modes by pressing Esc or <C-[>.

In Normal mode key presses don’t work as one would expect. That is, they don’t insert text into the document; instead, certain key presses can:

Move the cursor

  • h move one character left
  • j move one row down
  • k move one row up
  • l move one character right

As many vim commands, row movement can be prefixed by a number to move s everal lines at a time:

  • 4j move 4 rows down
  • 6k move 6 rows up

Basic word movements:

  • w move to beginning of next word
  • b move to previous beginning of word
  • e move to end of word
  • W move to beginning of next word after a whitespace
  • B move to beginning of previous word before a whitespace
  • E move to end of word before a whitespace

Beginning/End of line movement:

  • 0 move to the beginning of the line
  • $ move to the end of the line

Manipulate text

Enter other modes

Normal mode is where one should spend most of their time while using Vim. Remember, this is what makes Vim different.

In normal mode, there are multiple ways to move around an open file. In addition to using the cursor keys to move around, you can use h (left), j (down), k (up), and l (right) to move as well. This particularly helps touch typists who don’t like leaving the home row when making changes.

You can also make changes to single characters in normal mode. For example, to replace a single character, move your cursor over it and press r, and then the character you want to replace it with. Similarly, you can delete single characters by moving your cursor over it and pressing x.

To perform an undo, press u in normal mode. This undoes changes up to the last time you were in normal mode. If you want to redo (i.e., undo your undo) press Ctrl+r in normal mode.

Insert Mode

This is the second most used mode, and will be the most familiar behavior to most people. Once in insert mode, typing inserts characters just like a regular text editor. You can enter it by using an insert command from normal mode.

Insert commands include:

  • i for ’insert’, this immediately switches vim to insert mode
  • a for ’append’, this moves the cursor after the current character and enters insert mode
  • o inserts a new line below the current line and enters insert mode on the new line

These commands have an uppercase variety too:

  • I moves the cursor to the beginning of the line and enters insert mode
  • A moves the cursor to the end of the line and enters insert mode
  • O inserts a new line above the current one and enters insert mode on the new line

There are so many more ways of inserting text in Vim that can’t be listed here but these are the simplest. Also, beware of staying in insert mode for too long; Vim is not designed to be used in insert mode all the time.

To leave insert mode and return to normal mode, press Esc or <C-[>

Visual Mode

Visual mode is used to make selections of text, similar to how clicking and dragging with a mouse behaves. Selecting text allows commands to apply only to the selection, such as copying, deleting, replacing, and so on.

To make a text selection:

  • Press v to enter visual mode, this will also mark a starting selection point

  • Move the cursor to the desired end selection point; vim will provide a visual highlight of the text selection

Visual mode also has the following variants:

  • V to enter visual line mode, this will make text selections by line
  • <C-V> to enter visual block mode, this will make text selections by blocks; moving the cursor will make rectangle selections of the text

To leave visual mode and return to normal mode, press Esc or <C-[>.

The visual mode actually has multiple subtypes: visual, block-visual and linewise-visual

  • visual: like described above. Enter by pressing v
  • block-visual: select any rectangular region. Enter by pressing <ctrl>+v
  • linewise-visual: always select full lines. Enter by pressing <shift>+v

Command Mode

Command mode has a wide variety of commands and can do things that normal mode can’t do as easily. To enter command mode type ’:’ from normal mode and then type your command which should appear at the bottom of the window. For example, to do a global find and replace type :%s/foo/bar/g to replace all ‘foo’ with ‘bar’

  • : Enters command mode
  • % Means across all lines
  • s Means substitute
  • /foo is regex to find things to replace
  • /bar/ is regex to replace things with
  • /g means global, otherwise it would only execute once per line

Vim has a number of other methods that you can read about in the help documentation, :h or :help.

Replace Mode

Replace mode allows you replace existing text by directly typing over it. Before entering this mode, get into normal mode and put your cursor on top of the first character that you want to replace. Then press ‘R’ (capital R) to enter replace mode. Now whatever you type will replace the existing text. The cursor automatically moves to the next character just like in insert mode. The only difference is that every character you type will replace the existing one.