Learning Vim Editor – Part 2

2. Part 2: ex

ex is the underlying editor for vi. It offers a richer set of commands to do multi-line editing.

The general syntax for ex commands is: [scope]command[command argument], where scope specifies the range of lines that you want command to have effect on. A command without a scope is assumed to affect the current line. I’ll try to summarize scope, command and command argument in three separate subsections

2.1. Scope

Scope is represented by specifying two lines: Start Line and End Line. Command will only operate on lines within this bound. You can use any of the following methods to identify a target line, and you can use symbol ‘,’ to combine two lines to represent the scope.(Note: You can also use ‘;’ to combine two lines. The subtle difference lies in how current line anchor is defined when searching for Start Line and End Line)

    • Explicit line numbers: num1 represents line num1
    • Symbols: You can use the following symbols to specify a line relative to current line.
      . Current line
      $ Last line of file
      % Every line in the file
      symbol {+/-} num The line represented by symbol with offset {+/-}num

    • Search Patterns: /pattern/ represents the next line containing /pattern/. You can also use {+/-} to do offset.

2.2. Command

Here is a list of Commands:

:num Go to line num
:p Print lines
:# Print lines with line number
:= Print line number
:g/pattern/ cmd Run cmd on each of the lines containing pattern
:g/pattern/ cmd Run cmd on each of the lines not containing pattern
:d Delete
:m target line Move to target line
:co/t target line Copy to target line
:s/pattern1/pattern2/ Replace pattern1 with pattern2
:cmd1{|}cmd2 Combine multiple commands. Run cmd2 after cmd1
:w file Save to file but not quit
:r file Read file and append
:e file Open file to edit.
:q Quit if you have not made any edits

2.3. Command Arguments

Command argument format usually depends on the specific command. For example, :w takes a string to represent the name of the file, while :m takes as argument another line specified by one of the methods described in Scope. vi maintains two file names accessed most recently by :e, and there are two symbols that can be used in command arguments to represent them:

% Current file name
# Alternative file name

Learning Vim Editor – Part 1

Vim is an extremely powerful text editor, with which you can do complicated editing without your hand ever leaving the keyboard. Personally I do not like GUI oriented editors such as notepad++ because: A. I am too lazy to reach the mouse and B. GUI menu system often confuses me.

I am only a starter user of Vim and only know basic commands. I am trying to learn more of Vim, and this series of posts consist of my notes/cheatSheet from reading Learning the vi and Vim Editors.

Vim is an enhanced version of vi editor, which itself is an enhanced version(visual version) of ex editor. Therefore I’ll try to organize my notes into these three parts: Part 1: vi, Part 2: ex and Part 3: vim.

1. Part 1: vi

There are two modes in vi: Command Mode and Insert Mode. As the name suggests, Insert Mode is the mode where vi behaves like a normal text pad where you can type in characters and delete text using your keyboard one character at a time. However, the real power of vi comes from Command Mode, because in this mode you can do all sorts of high-level navigation and editing.

Based on functionality, vi commands can be roughly binned into the following 3 categories:

  • Navigation Commands are commands used to help us move around in the file(they only change position of your cursor, you always stay in Command Mode). For most of the commands you can apply a multiple number to execute the navigation command multiple times([multiple number]command will execute the command multiple number times)


h Left
j Down
k Up
l Right
CTRL+f Scroll forward one screen
CTRL+b Scroll backward one screen
CTRL+d Scroll forward half a screen
CTRL+u Scroll backward half a screen
CTRL+e Scroll screen up one line
CTRL+y Scroll screen down one line
H Move to top line on the screen
M Move to middle line on the screen
L Move to bottom line on the screen
z ENTER Move current line to top of screen
z. Move current line to center of screen
z- Move current line to bottom of screen
0 Move to beginning of line
$ Move to end of line
^ Move to first non-blank character of the line
num{|} Move to column num of the line
w Move cursor forward one word at a time
W Move cursor forward one word at a time, ignoring symbols
b Move cursor backward one word at a time
B Move cursor backward one word at a time, ignoring symbols
e To end of word
E To end of word, ignoring symbols
( Move to beginning of current sentence
) Move to beginning of next sentence
{ Move to beginning of current paragraph
} Move to beginning of next paragraph
% Move to matching bracket. Useful for programming
+ To first character of next line
To first character of previous line
G Go to end of file
numG Go to line num
/pattern Search regular expression pattern
?pattern Search regular expression pattern in backward direction
n Repeat search in same direction
N Repeat search in opposite direction
fchar Find next occurance of char in the line
Fchar Find previous occurance of char in the line
tchar Find character before next occurance of char in the line
Tchar Find character after previous occurance of char in the line
; Repeat previous find operation in the same direction
mchar Mark current position with char (char can be any letter)
`char Move cursor to character marked by char
char Move cursor first character of line marked by char
Return cursor to your original position
Return cursor to the first character of the line of original position

  • Editing Commands contains commands to do editing. Depending on the type of the edit, You will either go from Command Mode into Insert Mode, or you stay in Command Mode. You can always get back to Command Mode by pressing ESC key. General syntax for commands in this category is command[multiple number][destination] and [multiple number]command[destination], which basically mean executing command multiple number times from current position to the position indicated by destination. destination is usually one of Navigation Commands described above.
    i Insert
    I Insert at beginning of line
    a Append
    A Append to end of line
    o Open blank line below cursor for text
    O Open blank line above cursor for text
    c Change
    C Replace characters from current cursor position to end of current line
    cc/S Replace entire current line
    s Delete character at cursor and substitute text
    S/cc Delete entire line and substitute text
    r replace a single character
    R replace any number of characters
    x Delete a single character
    X Delete a single character before current position
    d Delete
    D Delete to end of line
    p Put
    P Put before current position
    y Yank
    Y/yy Yank the whole line
    J Join two lines
    ~ Change case
    . Repeat last edit command
    u Undo last command
    U Undo all edits on a single line
    char Access buffer char


  • Other Commands contain commands to do miscellaneous things, like saving the file, quit vi, change vi environment etc.
    ESC Change to Command Mode
    Q Go to ex editor. Type vi to get back to vi
    ZZ/:wq Save and quit
    CTRL+l Redraw the screen
    CTRL+g Show current line position information
    vim +num file Open file and go to line num
    vim + file Open file and go to last line
    vim +/pattern Open file and go to first occurrence of pattern
    vim -R file Open file in read-only mode
    vim -r file Open file and recover edit buffer
    :set wm=num Automatically insert a newline after num characters
    :set nowrapscan Disable wrap from beginning of file when doing search
    :set nu/number Display line numbers
    :set nonu/nonumber Disable display line numbers
    :set autoindent Enable autoindentation for programming
    :set noautoindent Disable autoindentation
    :set list Show tab as special character
    :set nolist Show tab as normal tab
    :set showmatch Show matching bracket in Insert Mode
    :sh Create a shell. Type EXIT to terminate the shell and come back to vi
    :ab abbr phrase Abbreviate phrase to abbr
    :unab abbr Disable abbreviation abbr
    :map x sequence Define character x as a sequence of editing commands
    :unmap x Undefine mapping x
    :!cmd execute shell command cmd