User Tools

Site Tools



There's an old joke that Emacs would be a great operating system if only it had a decent text editor,
whereas vi would be a great text editor if only it had a decent operating system.

vi cheat-sheet

a. cursor movements (items below are sometimes called objects):
        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)
b. deleting:
        d - delete
                then add one of the cursor movement symbols to
                show what should be deleted, i.e.:
                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)
        x - delete character cursor is on
c. other basic commands:
        r - replace one character
        ZZ - save and exit (hold down shift and press "z" twice)
        y - yank (copy into temporary buffer)
                then add cursor movement symbol to show what should be
                copied, for example: y) - copy to the end of sentence
        Y - yank line cursor is on
        p - paste below cursor line (deleted or copied text)
        P - paste above cursor line
        u - undo last editing command
        /sometext - search for "sometext"
d. any command can take numeric argument before the name of "object", i.e.:
        5dd - delete 5 lines beginning with cursor line (or) d5d - same
        2dw - delete two words (or) d2w - delete two words
        c3w - change 3 words
        3Ctrl-B - move up three pages
        1G - go to the first line
e. external commands can be performed on the selected text (in lines)
   if command is started with "!", i.e.:
        !}fmt - reformat paragraph to 72 columns
f. command line (sometimes called "ex mode"):
g. from the command line a "set" command can be executed to 
   customize editing environment, i.e.:
        :set all - will show the state of all options
        :set number - will show on the screen numbers of all lines
        :set autoindent   // obvious
h. from the command line operations can be performed on the range of lines,
        :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
i. from the command line any external UNIX command can be performed on 
   the range of lines if line range is superseded by "!":
        :11,16! sed -e "s/^/\/\*/" -e "s/$/\*\//"
                (the command above wraps the block of text with
                 "C" style comments - /* text */.  It can be done
                  easier, but this is an example)
        :14,19! sort -r +3
                (sort the table in reverse order by fourth column)
j. file manipulation from the command line:
        :r somefile - read in "somefile"
        :x - save and exit (if file is "Read Only", this command will
                exit without saving)
        :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
k. text input commands (all require "Esc" to terminate):
        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
        c - change (replace previous text with new one)
                takes arguments just like the delete command - it is
                a fast and powerful way of changing original text -
                much more so than typical "overwrite"
        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
l. if in doubt, press "Esc"


File Cleaning

Remove Blank line from the file

to remove blank lines please use following.



:g/^ *$/d

Remove Tailing space as well space at beginning using VI

To remove tailing space


To remove space at beginning


Replace tab with space

To replace tab with space you need to use

:%s/[CTRL-i]/ /g

Delete Line start with

To delete lines start with some word e.g. Redirect


Remove Dos / Windows carriage-return

To remove Carriage return in vi use following


NOTE : to create “^M” use “Ctrl+v Ctrl+M” Regular ^M does not help.

Convert all character to lower OR upper case

NOTE : This will apply to whole file as we are using (%)
To convert upper case use following


To convert lower case use following


Match Start of line Append End of line

To Match Start of line and append that line use following
(search Append end of line)


Which append “/www” if start of line is “DocumentRoot”.

Also you can append after word by following.


So all word is get replaced by “wordtest”.

Saving file as root

At some point you would like to save file as root.

:w !sudo tee %

Quick tools

Comment line from current line.



mk - record current location as mark k (redefines any previous mark k)
'k - return to line of mark k               
`k - return to mark k
d'k - delete to line of mark k              
d`k - delete to mark k
c'k - change text to line of mark k         
c`k - change text to mark k
"ay'd - yank text into buffer a from cursor through line of mark d


o - open a new line above cursor(*)
O - open a new line below cursor(*)
i - insert text ahead of cursor(*)                
I - insert text at the beginning of the line(*)
a - append text after the cursor(*)               
A - append text at the end of the line(*)
c$ - change to end of the line (*)                
d$ - delete to end of the line
C - same as c$ (*)                                
D - same as d$
cG - change to end of the file (*)                
dG - delete to end of the file
c0 - change to beginning of file (*)              
d0 - delete to beginning of file
cc - change line (*)                              
dd - delete line
c'm - change from cursor through mark m (*)       
d'm - delete from cursor through mark m
3cc - change 3 lines (*)                          
3dd - delete 3 lines
8cw - change next 8 words (*)                     
8dw - delete next 8 words
R - overwrite current line, starting at cursor(*) 
r - replace character at cursor 
s - substitute for character at cursor (*)        
8s - substitute for next 8 characters (*)        
S - substitute for entire line (*)                
J - join two lines together
. - repeats previous edit command                 
xp - transpose two characters
easESC - add a plural, and go back to command mode


h - move to the left                            
CTL-f - change display forward a page
j - `jump` down a line                          
CTL-b - change display back a page
k - move up a line                              
CTL-d - change display down half a page
l - move to the right                           
CTL-u - change display up half a page
- - same as k                                   
CTL-y - shift display down on screen
+ - same as j                                   
CTL-e - shift display up on screen
e - move to the end of a word                   
z. - recenter display around cursor
w - move forward to the beginning of a word     
z- - recenter display so cursor is at top
b - move backward to the beginning of a word    
z+ - recenter display aso cursor is at bottom
$ - move to the end of the line                 
zCR - recenter display so cursor is at top
0 - move to the beginning of the line           
'm - move to the beginning of the line of mark m
^ - move to the beginning of the line           
`m - move to the location of mark m
G - move to the end of the file
gg - move to the beginning of the file                 
) - move forward 1 sentence
H - move to the top of the display              
( - move back 1 sentence
M - move to the middle of the display            
} - move forward 1 paragraph
L - move to the bottom of the display            
{ - move back 1 paragraph
B - move back to previous blank space           
20| - go to 20th character in the line
E - move ahead to next blank space              
CTL-L - clear and redraw
B - move back to previous blank space           
CR - same as j
CTL-G - print current location in the file       
:22 - move to line 22
6w - move forward 6 words
6b - move backward 6 words
8+ - move down 8 lines

Play with Buffers

yy - yank current line to unnamed buffer            
"j8yy - yank 8 lines into buffer j
19yy - yank next 19 lines to unnamed buffer         
"J8YY - append the next 8 lines into buffer j
p - put unnamed buffer contents after cursor                  
p - recover previous edit
P - put unnamed buffer contents before cursor               
"1p - recover 2nd previous edit
19dd - delete next 19 lines, and put them in unnamed buffer 
"7p - recover 8th previous edit
"bp - put the contents of buffer p into current file 
:11,14 ya w - yank lines 11 through 14 into buffer w
:94 pu w - put contents of buffer w after line 94

VIM Scripts

Introduction to vim scripts “:help vim-script-intro”

Running Vim scripts

There is many way to run vim script simple way is to run calling script from `source`

:source /home/yahoo/test.vim

You can also call command from script directly

:call MyBackupFunc(expand('%'), { 'all':1, 'save':'recent'})

You can do mapping of the keyboard using the variables.

:nmap ;s :source /home/yahoo/test.vim<CR>

The key sequence `;s` will execute the specified script file
You can call fucntion using the stored mapping same way.

:nmap \b :call MyBackupFunc(expand('%'), { 'all': 1 })<CR>

To call the function you need to call enter squence `\b`

syntax highlighting

VIM support syntax highlighting. to turn it on.

:syntax on

to turn it off

:syntax off

VIM Variable / Initialization (.vimrc)


You can use .exrc

toggle syntax highlighting
function! ToggleSyntax()
   if exists("g:syntax_on")
      syntax off
      syntax enable
nmap <silent>  ;s  :call ToggleSyntax()<CR>

`;s` sequence to flip syntax highlighting on or off every time typed when you're in Normal mode.
nmap stands for “normal-mode key mapping”.
<silent> option causes the mapping not to echo any command it's executing.

Creating centered titles
function! CapitalizeCenterAndMoveDown()
   s/\<./\u&/g   "Built-in substitution capitalizes each word
   center        "Built-in center command centers entire line
   +1            "Built-in relative motion (+1 line down)
nmap <silent>  \C  :call CapitalizeCenterAndMoveDown()<CR>

single backslash used for continuation marker

call SetName(
\             first_name,
\             middle_initial,
\             family_name
\           )

Also you can use “|” to write two line on singe line.

echo "Starting..." | call Phase(1) | call Phase(2) | echo "Done"

You can comment using single quote, as double quote used to define a string.
also you can use “|” to escape the comment in some cases.

echo "> " |"Print generic prompt

Defining variable

to define variable you need to use word `let`

let name = "Damian"
let height = 165
let interests = [ 'Cinema', 'Literature', 'World Domination', 101 ]
let phone     = { 'cell':5551017346, 'home':5558038728, 'work':'?' }
  • scalar: a single value, such as a string or a number. For example: “Damian” or 165
  • list: an ordered sequence of values delimited by square brackets, with implicit integer indices starting at zero. For example: ['Cinema', 'Literature', 'World Domination', 101]
  • dictionary: an unordered set of values delimited by braces, with explicit string keys. For example: {'cell':5551017346, 'home':5558038728, 'work':'?'}

Sample .vimrc

set number
"       show line number
set nocompatible 
"       This setting prevents vim from emulating the original vi's bugs and limitations.
set autoindent
set smartindent 
"       The first setting tells vim to use "autoindent" 
"       (that is, use the current line's indent level to set the indent level of newlines). 
"       The second makes vim attempt to intelligently guess the indent level of any new line based on the previous line, 
"       assuming the source file is in a C-like language. Combined, they are very useful in writing well-formatted source code.
set tabstop=4
set shiftwidth=4 
"       I prefer 4-space tabs to 8-space tabs. The first setting sets up 4-space tabs,
"       and the second tells vi to use 4 spaces when text is indented (auto or with the manual indent adjustmenters.)
set showmatch 
"       This setting will cause the cursor to very briefly jump to a brace/parenthese/bracket's "match" 
"       whenever you type a closing or opening brace/parenthese/bracket. 
"       I've had almost no mismatched-punctuation errors since I started using this setting.
set guioptions-=T 
"       I find the toolbar in the GUI version of vim (gvim) to be somewhat useless visual clutter.
"       This option gets rid of the toolbar.
set vb t_vb= 
"       This setting prevents vi from making its annoying beeps when a command doesn't work.
"       Instead, it briefly flashes the screen -- much less annoying.
set ruler 
"       This setting ensures that each window contains a statusline that displays the current cursor position.
set nohls 
"       By default, search matches are highlighted. I find this annoying most of the time. 
"       This option turns off search highlighting. You can always turn it back on with :set hls.
set incsearch 
"       With this nifty option, vim will search for text as you enter it. 
"       For instance, if you type /bob to search for bob, vi will go to the first "b" after you type the "b," 
"       to the first "bo" after you type the "o," and so on. 
"       It makes searching much faster, since if you pay attention you never have to enter 
"       more than the minimum number of characters to find your target location. 
"       Make sure that you press Enter to accept the match after vim finds the location you want.
set virtualedit=all 
"       By default, vim doesn't let the cursor stray beyond the defined text. 
"       This setting allows the cursor to freely roam anywhere it likes in command mode. 
"       It feels weird at first but is quite useful.
"       Type :help options within vim to get a complete list of options. 
highlight Comment ctermfg=green
"       Comments are shown in a brightgreen color which is visible clearly as against 
"       a dark blue which is annoyingly hard to read to read, at least to me.
:set nu ts=4 sw=4 shiftround ignorecase smartcase
" let perl_fold=1
:colorscheme elflord
" to set the title of the window where you are working
:set title
:auto BufEnter * let &titlestring = hostname() . ":" . expand("%:p")
:auto BufEnter * let &titleold = hostname() . ":" . getcwd()
:set statusline+=%f\
:set smartindent
:set expandtab
:set tabstop=4
:set ruler
:set nowrap
:set incsearch
:au Syntax pl   source ~/.vim/test.vim
:au Syntax pm   source ~/.vim/test.vim
:au Syntax pod  source ~/.vim/test.vim
:au Syntax lib  source ~/.vim/test.vim
":set foldmethod=indent
":set foldlevel=0

Basic Info

Variable scoping
g: varname  	 The variable is global
s: varname 	The variable is local to the current script file
w: varname 	The variable is local to the current editor window
t: varname 	The variable is local to the current editor tab
b: varname 	The variable is local to the current editor buffer
l: varname 	The variable is local to the current function
a: varname 	The variable is a parameter of the current function
v: varname 	The variable is one that Vim predefines
& varname  	 A Vim option (local option if defined, otherwise global)
&l: varname 	A local Vim option
&g: varname 	A global Vim option
@ varname 	A Vim register
$ varname 	An environment variable
vim.txt · Last modified: 2020/08/10 02:35 (external edit)