Best of Vim Tips

David Rayner (zzapper) 15 Years of Vi + 7 years of Vim and still learning 23Aug08 : Last Update



” new items marked *N* , corrected items marked *C*

” searching

/joe/e : cursor set to End of match

/joe/e+1 : cursor set to End of match plus 1

/joe/s-2 : cursor set to Start of match minus 2

/joe/+3 : find joe move cursor 3 lines down

/^joe.*fred.*bill/ : find joe AND fred AND Bill (Joe at start of line)

/^[A-J]/ : search for lines beginning with one or more A-J

/begin_.*end : search over possible multiple lines

/fred_s*joe/ : any whitespace including newline *C*

/fred|joe : Search for FRED OR JOE

/.*fred&.*joe : Search for FRED AND JOE in any ORDER!

// : search for fred but not alfred or frederick *C*

/ : Search for exactly 4 digit numbers

/DddddD : Search for exactly 4 digit numbers

/ : same thing

/([^0-9]|^)%.*% : Search for absence of a digit or beginning of line

” finding empty lines

/^n{3} : find 3 empty lines

/^str.*nstr : find 2 successive lines starting with str

/(^str.*n){2} : find 2 successive lines starting with str

” using rexexp memory in a search


” Repeating the Regexp (rather than what the Regexp finds)


” visual searching

:vmap // y/” : search for visually highlighted text

:vmap // y/=escape(@”, ‘\/.*$^~[]’) : with spec chars

” zs and ze regex delimiters :h /zs

/]*ze> : search for tag contents, ignoring chevrons

” zero-width :h /@=

/<@]*>@= : search for tag contents, ignoring chevrons

/<@]*>@= : search for tags across possible multiple lines

” searching over multiple lines _ means including newline

/ : search for multiple line comments

/fred_s*joe/ : any whitespace including newline *C*

/bugs(_.)*bunny : bugs followed by bunny anywhere in file

:h _ : help

” search for declaration of subroutine/function under cursor

:nmap gx yiw/^(subfunction)s+”

” multiple file search

:bufdo /searchstr/ : use :rewind to recommence search

” multiple file search better but cheating

:bufdo %s/searchstr/&/gic : say n and then a to stop

” How to search for a URL without backslashing

? : (first) search BACKWARDS!!! clever huh!

” Specify what you are NOT searching for (vowels)

/cv([^aeiou]&a){4} : search for 4 consecutive consonants

/%>20l%<30lgoat : Search for goat between lines 20 and 30 *N*

/^.{-}home.{-}zshome/e : match only the 2nd occurence in a line of “home” *N*

:%s/home.{-}zshome/alone : Substitute only the occurrence of home in any line *N*

” find str but not on lines containing tongue







:%s/fred/joe/igc : general substitute command

:%s//joe/igc : Substitute what you last searched for *N*

:%s/~/sue/igc : Substitute your last replacement string for *N*

:%s/r//g : Delete DOS returns ^M

” Is your Text File jumbled onto one line? use following

:%s/r/r/g : Turn DOS returns ^M into real returns

:%s= *$== : delete end of line blanks

:%s= +$== : Same thing

:%s#s*r?$## : Clean both trailing spaces AND DOS returns

:%s#s*r*$## : same thing

” deleting empty lines

:%s/^n{3}// : delete blocks of 3 empty lines

:%s/^n+/r/ : compressing empty lines

:%s#]+>##g : delete html tags, leave text (non-greedy)

:%s###g : delete html tags possibly multi-line (non-greedy)

” VIM Power Substitute

:’a,’bg/fred/s/dick/joe/igc : VERY USEFUL

” duplicating columns

:%s= [^ ]+$=&&= : duplicate end column

:%s= f+$=&&= : same thing

:%s= S+$=&& : usually the same

” memory

%s#.*(tbl_w+).*#1# : produce a list of all strings tbl_* *N*

:s/(.*):(.*)/2 : 1/ : reverse fields separated by :

:%s/^(.*)n1$/1/ : delete duplicate lines

” non-greedy matching {-}

:%s/^.{-}pdf/new.pdf/ : delete to 1st pdf only

” use of optional atom ?

:%s##L&#gc : lowercase with optional leading characters

” over possibly many lines

:%s/// : delete possibly multi-line comments

:help /{-} : help non-greedy

” substitute using a register

:s/fred/a/g : sub “fred” with contents of register “a”


:s/fred/=@a/g : better alternative as register not displayed

” multiple commands on one line

:%s/f+.gif>/r&r/g | v/.gif$/d | %s/gif/jpg/

:%s/a/but/gie|:update|:next : then use @: to repeat

” ORing

:%s/suck|buck/loopy/gc : ORing (must break pipe)

:%s/v(.*n){5}/&r : insert a blank line every 5 lines *N*

” Calling a VIM function

:s/__date__/=strftime(“%c”)/ : insert datestring

” Working with Columns sub any str1 in col3


” Swapping first & last column (4 columns)


” filter all form elements into paste register

:redir @*|sil exec ‘g##p’|redir END

:nmap ,z :redir @*sil exec ‘g@<(inputselecttextarea/=form)>@p’redir END

” substitute string in column 30 *N*


” decrement numbers by 3


” increment numbers by 6 on certain lines only


” better


:h /zs

” increment only numbers ggdd by 6 (another way)


:h zero-width

” rename a string with an incrementing number

:let i=10 | ‘a,’bg/Abc/s/yy/=i/ |let i=i+1 # convert yy to 10,11,12 etc

” as above but more precise

:let i=10 | ‘a,’bg/Abc/s/xxzsyyze/=i/ |let i=i+1 # convert xxyy to xx11,xx12,xx13

” find replacement text, put in memory, then use zs to simplify substitute


” Pull word under cursor into LHS of a substitute

:nmap z :%s#<=expand(“”)>#

” Pull Visually Highlighted text into LHS of a substitute

:vmap z :%s/<*>/

” substitute singular or plural

:’a,’bs/bucket(s)*/bowl1/gic *N*


” all following performing similar task, substitute within substitution

” Multiple single character substitution in a portion of line only

:%s,(all/.*)@<=/,_,g : replace all / with _ AFTER “all/”

” Same thing

:s#all/zs.*#=substitute(submatch(0), ‘/’, ‘_’, ‘g’)#

” Substitute by splitting line, then re-joining


” Substitute inside substitute

:%s/.*/=’cp ‘.submatch(0).’ all/’.substitute(submatch(0),’/’,’_’,’g’)/


” global command display

:g/gladiolli/# : display with line numbers (YOU WANT THIS!)

:g/fred.*joe.*dick/ : display all lines fred,joe & dick

:g// : display all lines fred but not freddy

:g/^s*$/d : delete all blank lines

:g!/^dd/d : delete lines not containing string

:v/^dd/d : delete lines not containing string

:g/fred/,/joe/d : not line based (very powerfull)

:g/fred/,/joe/j : Join Lines *N*

:g/——-/.-10,.d : Delete string & 10 previous lines

:g/{/ ,/}/- s/n+/r/g : Delete empty lines but only between {…}

:v/S/d : Delete empty lines (both types)

:v/./,/./-j : compress empty lines

:g/^$/,/./-j : compress empty lines

:g/<input|<form/p : ORing

:g/^/put_ : double space file (pu = put)

:g/^/m0 : Reverse file (m = move)

:’a,’bg/^/m’b : Reverse a section a to b

:g/^/t. : duplicate every line

:g/fred/t$ : copy(transfer) lines matching fred to EOF

:g/stage/t’a : copy (transfer) lines matching stage to marker a (cannot use .) *C*

:g/(^I[^^I]*){80}/d : delete all lines containing at least 80 tabs

” perform a substitute on every other line

:g/^/ if line(‘.’)%2|s/^/zz /

” match all lines containing “somestr” between markers a & b

” copy after line containing “otherstr”

:’a,’bg/somestr/co/otherstr/ : co(py) or mo(ve)

” as above but also do a substitution


:%norm jdd : delete every other line

” incrementing numbers (type as 5 characters)

:.,$g/^d/exe “norm! “: increment numbers

:’a,’bg/d+/norm! ^A : increment numbers

” storing glob results (note must use APPEND) you need to empty reg a first with qaq.

“save results to a register/paste buffer

:g/fred/y A : append all lines fred to register a

:g/fred/y A | :let @*=@a : put into paste buffer

:let @a=”|g/Barratt/y A |:let @*=@a

” filter lines to a file (file must already exist)

:’a,’bg/^Error/ . w >> errors.txt

” duplicate every line in a file wrap a print ” around each duplicate

:g/./yank|put|-1s/’/”/g|s/.*/Print ‘&’/

” replace string with contents of a file, -d deletes the “mark”

:g/^MARK$/r tmp.txt | -d

” display prettily

:g//z#.5 : display with context

:g//z#.5|echo “==========” : display beautifully

” Combining g// with normal mode commands

:g/|/norm 2f|r* : replace 2nd | with a star

“send output of previous global command to a new window

:nmap :redir @a:g//:redir END:new:put! a


” Global combined with substitute (power editing)

:’a,’bg/fred/s/joe/susan/gic : can use memory to extend matching

:/fred/,/joe/s/fred/joe/gic : non-line based (ultra)

:/biz/,/any/g/article/s/wheel/bucket/gic: non-line based *N*


” Find fred before beginning search for joe



” create a new file for each line of file eg 1.txt,2.txt,3,txt etc

:g/^/exe “.w “.line(“.”).”.txt”


” Summary of editing repeats *N*

. last edit (magic dot)

:& last substitute

:%& last substitute every line

:%&gic last substitute every line confirm

g% normal mode repeat last substitute

g& last substitute on all lines

@@ last recording

@: last command-mode command

:!! last :! command

:~ last substitute

:help repeating


” Summary of repeated searches

; last f, t, F or T

, last f, t, F or T in opposite direction

n last / or ? search

N last / or ? search in opposite direction


” Absolutely essential


* # g* g# : find word under cursor () (forwards/backwards)

% : match brackets {}[]()

. : repeat last modification

@: : repeat last : command (then @@)

matchit.vim : % now matches tags

<?php etc

: word completion in insert mode

: Line complete SUPER USEFUL

/ : Pull onto search/command line

/ : Pull onto search/command line

:set ignorecase : you nearly always want this

:set smartcase : overrides ignorecase if uppercase used in search string (cool)

:syntax on : colour syntax in Perl,HTML,PHP etc

:h regexp : type control-D and get a list all help topics containing

regexp (plus use TAB to Step thru list)



:nmap ,s :source $VIM/_vimrc

:nmap ,v :e $VIM/_vimrc

” How to have a variant in your .vimrc for different PCs *N*


ab mypc vista


ab mypc dell25



“VISUAL MODE (easy to add other HTML Tags)

:vmap sb “zdiz : wrap around VISUALLY selected Text

:vmap st “zdi<?= z ?> : wrap around VISUALLY selected Text


“vim 7 tabs

vim -p fred.php joe.php : open files in tabs

:tabe fred.php : open fred.php in a new tab

:tab ball : tab open files

” vim 7 forcing use of tabs from .vimrc

:nnoremap gf gf

:cab e tabe

:tab sball : retab all files in buffer (repair) *N*


” Exploring

:e . : file explorer

:Exp(lore) : file explorer note capital Ex

:Sex(plore) : file explorer in split window

:browse e : windows style browser

:ls : list of buffers

:cd .. : move to parent directory

:args : list of files

:args *.php : open list of files (you need this!)

:lcd %:p:h : change to directory of current file

:autocmd BufEnter * lcd %:p:h : change to directory of current file automatically (put in _vimrc)


” Changing Case

guu : lowercase line

gUU : uppercase line

Vu : lowercase line

VU : uppercase line

g~~ : flip case line

vEU : Upper Case Word

vE~ : Flip Case Word

ggguG : lowercase entire file

” Titlise Visually Selected Text (map for .vimrc)

vmap ,c :s//u1L2/g

” titlise a line

nmap ,t :s/.*/L&/:s/<./u&/g *N*

” Uppercase first letter of sentences



gf : open file name under cursor (SUPER)

:nnoremap gF :view : open file under cursor, create if necessary

ga : display hex,ascii value of char under cursor

ggVGg? : rot13 whole file

ggg?G : rot13 whole file (quicker for large file)

:8 | normal VGg? : rot13 from line 8

:normal 10GVGg? : rot13 from line 8

, : increment,decrement number under cursor

win32 users must remap CNTRL-A

=5*5 : insert 25 into text (mini-calculator)


” Make all other tips superfluous

:h 42 : also

:h holy-grail



” Markers & moving about

‘. : jump to last modification line (SUPER)

`. : jump to exact spot in last modification line

g; : cycle thru recent changes (oldest first)

g, : reverse direction


:h changelist : help for above

: retrace your movements in file (starting from most recent)

: retrace your movements in file (reverse direction)

:ju(mps) : list of your movements

:help jump-motions

:history : list of all your commands

:his c : commandline history

:his s : search history

q/ : Search history Window (puts you in full edit mode) (exit CTRL-C)

q: : commandline history Window (puts you in full edit mode) (exit CTRL-C)

: : history Window (exit CTRL-C)


” Abbreviations & Maps

” Following 4 maps enable text transfer between VIM sessions

:map :’a,’bw! c:/aaa/x : save text to file x

:map :r c:/aaa/x : retrieve text

:map :.w! c:/aaa/xr : store current line

:map :r c:/aaa/xr : retrieve current line

:ab php : list of abbreviations beginning php

:map , : list of maps beginning ,

” allow use of F10 for mapping (win32)

set wak=no : :h winaltkeys

” For use in Maps

: carriage Return for maps

: Escape

: normally

: | pipe

: backspace

: No hanging shell window

#display RGB colour under the cursor eg #445588

:nmap c :hi Normal guibg=#=expand(“”)

map /price only\|versus/ :in a map need to backslash the

# type table,,, to get

### Cool ###

imap ,,, bdwa<pa></pa>kA


” Simple PHP debugging display all variables yanked into register a

iab phpdb exit(“

Debug a “);


” Using a register as a map (preload registers in .vimrc)

:let @m=”:’a,’bs/”

:let @s=”:%!sort -u”


” Useful tricks

“ayy@a : execute “Vim command” in a text file

yy@” : same thing using unnamed register

u@. : execute command JUST typed in

“ddw : store what you delete in register d *N*

“ccaw : store what you change in register c *N*


” Get output from other commands (requires external programs)

:r!ls : reads in output of ls

:r !grep “^ebay” file.txt : grepping in content *N*

:20,25 !rot13 : rot13 lines 20 to 25 *N*

!!date : same thing (but replaces/filters current line)

” Sorting with external sort

:%!sort -u : use an external program to filter content

:’a,’b!sort -u : use an external program to filter content

!1} sort -u : sorts paragraph (note normal mode!!)

:g/^$/;,/^$/-1!sort : Sort each block (note the crucial 😉

” Sorting with internal sort

:sort /.*%2v/ : sort all lines on second column *N*


” Multiple Files Management (Essential)

:bn : goto next buffer

:bp : goto previous buffer

:wn : save file and move to next (super)

:wp : save file and move to previous

:bd : remove file from buffer list (super)

:bun : Buffer unload (remove window but not from list)

:badd file.c : file from buffer list

:b3 : go to buffer 3 *C*

:b main : go to buffer with main in name eg main.c (ultra)

:sav php.html : Save current file as php.html and “move” to php.html

:sav! %<.bak : Save Current file to alternative extension (old way)

:sav! %:r.cfm : Save Current file to alternative extension

:sav %:s/fred/joe/ : do a substitute on file name

:sav %:s/fred/joe/:r.bak2 : do a substitute on file name & ext.

:!mv % %:r.bak : rename current file (DOS use Rename or DEL)

:help filename-modifiers

:e! : return to unmodified file

:w c:/aaa/% : save file elsewhere

:e # : edit alternative file (also cntrl-^)

:rew : return to beginning of edited files list (:args)

:brew : buffer rewind

:sp fred.txt : open fred.txt into a split

:sball,:sb : Split all buffers (super)

:scrollbind : in each split window

:map :ls:e # : Pressing F5 lists all buffer, just type number

:set hidden : Allows to change buffer w/o saving current buffer


” Quick jumping between splits

map j_

map k_


” Recording (BEST TIP of ALL)

qq # record to q

your complex series of commands

q # end recording

@q to execute

@@ to Repeat

5@@ to Repeat 5 times

” editing a register/recording

“qp :display contents of register q (normal mode)

q :display contents of register q (insert mode)

” you can now see recording contents, edit as required

“qdd :put changed contacts back into q

@q :execute recording/register q

” Operating a Recording on a Visual BLOCK

1) define recording/register

qq:s/ to/ from/g^Mq

2) Define Visual BLOCK


3) hit : and the following appears


4)Complete as follows

:’norm @q


“combining a recording with a map (to end up in command mode)

:nnoremap ] @q:updatebd


” Visual is the newest and usually the most intuitive editing mode

” Visual basics

v : enter visual mode

V : visual mode whole line

: enter VISUAL BLOCK mode

gv : reselect last visual area (ultra)

o : navigate visual area

“*y or “+y : yank visual area into paste buffer *C*

V% : visualise what you match

V}J : Join Visual block (great)

V}gJ : Join Visual block w/o adding spaces

`[v`] : Highlight last insert


” Delete first 2 characters of 10 successive lines



” how to copy a set of columns using VISUAL BLOCK

” visual block (AKA columnwise selection) (NOT BY ordinary v command)

then select “column(s)” with motion commands (win32 )

then c,d,y,r etc


” how to overwrite a visual-block of text with another such block *C*

” move with hjkl etc

Pick the first block: ctrl-v move y

Pick the second block: ctrl-v move P


” text objects :h text-objects *C*

daW : delete contiguous non whitespace

di< yi< ci< : Delete/Yank/Change HTML tag contents

da< ya< ca< : Delete/Yank/Change whole HTML tag

dat dit : Delete HTML tag pair

diB daB : Empty a function {}

das : delete a sentence


” _vimrc essentials

:set incsearch : jumps to search word as you type (annoying but excellent)

:set wildignore=*.o,*.obj,*.bak,*.exe : tab complete now ignores these

:set shiftwidth=3 : for shift/tabbing

:set vb t_vb=”. : set silent (no beep)

:set browsedir=buffer : Maki GUI File Open use current directory


” launching Win IE

:nmap ,f :update:silent !start c:progra~1intern~1iexplore.exe file://%:p

:nmap ,i :update: !start c:progra~1intern~1iexplore.exe


” FTPing from VIM

cmap ,r :Nread

cmap ,w :Nwrite

gvim # uses netrw.vim


” appending to registers (use CAPITAL)

” yank 5 lines into “a” then add a further 5





[I : show lines matching word under cursor (super)


” Conventional Shifting/Indenting


” visual shifting (builtin-repeat)

:vnoremap < <gv

:vnoremap > >gv

” Block shifting (magic)



” also

>% and <%


” Redirection & Paste register *

:redir @* : redirect commands to paste buffer

:redir END : end redirect

:redir >> out.txt : redirect to a file

” Working with Paste buffer

“*yy : yank to paste

“*p : insert from paste buffer

” yank to paste buffer (ex mode)

:’a,’by* : Yank range into paste

:%y* : Yank whole buffer into paste

:.y* : Yank Current line to paster

” filter non-printable characters from the paste buffer

” useful when pasting from some gui application

:nmap p :let @* = substitute(@*,'[^[:print:]]’,”,’g’)”*p


” Re-Formatting text

gq} : Format a paragraph

gqap : Format a paragraph

ggVGgq : Reformat entire file

Vgq : current line

” break lines at 70 chars, if possible after a ;



” Operate command over multiple files

:argdo %s/foo/bar/e : operate on all files in :args

:bufdo %s/foo/bar/e

:windo %s/foo/bar/e

:argdo exe ‘%!sort’|w! : include an external command

:bufdo exe “normal @q” | w : perform a recording on open files

:silent bufdo !zip %:p : zip all current files


” Command line tricks

gvim -h : help

ls | gvim – : edit a stream!!

cat xx | gvim – -c “v/^dd|^[3-9]/d ” : filter a stream

gvim -o file1 file2 : open into a split

” execute one command after opening file

gvim.exe -c “/main” joe.c : Open joe.c & jump to “main”

” execute multiple command on a single file

vim -c “%s/ABC/DEF/ge | update” file1.c

” execute multiple command on a group of files

vim -c “argdo %s/ABC/DEF/ge | update” *.c

” remove blocks of text from a series of files

vim -c “argdo /begin/+1,/end/-1g/^/d | update” *.c

” Automate editing of a file (Ex commands in convert.vim)

vim -s “convert.vim” file.c

#load VIM without .vimrc and plugins (clean VIM)

gvim -u NONE -U NONE -N

” Access paste buffer contents (put in a script/batch file)

gvim -c ‘normal ggdG”*p’ c:/aaa/xp

” print paste contents to default printer

gvim -c ‘s/^/=@*/|hardcopy!|q!’

” gvim’s use of external grep (win32 or *nix)

:grep somestring *.php : creates a list of all matching files

” use :cn(ext) :cp(rev) to navigate list

:h grep

” Using vimgrep with copen *N*

:vimgrep /keywords/ *.php



” GVIM Difference Function (Brilliant)

gvim -d file1 file2 : vimdiff (compare differences)

dp : “put” difference under cursor to other file

do : “get” difference under cursor from other file

” complex diff parts of same file *N*

:1,2yank a | 7,8yank b

:tabedit | put a | vnew | put b

:windo diffthis


” Vim traps

In regular expressions you must backslash + (match 1 or more)

In regular expressions you must backslash | (or)

In regular expressions you must backslash ( (group)

In regular expressions you must backslash { (count)

/fred+/ : matches fred/freddy but not free

/(fred){2,3}/ : note what you have to break


” v or very magic (usually) reduces backslashing

/codes(n|s)*where : normal regexp

/vcodes(n|s)*where : very magic


” pulling objects onto command/search line (SUPER)

: pull word under the cursor into a command line or search

: pull WORD under the cursor into a command line or search

– : pull small register (also insert mode)

[0-9a-z] : pull named registers (also insert mode)

% : pull file name (also #) (also insert mode)

=somevar : pull contents of a variable (eg :let sray=”ray[0-9]”)


” List your Registers

:reg : display contents of all registers

:reg a : display content of register a

:reg 12a : display content of registers 1,2 & a *N*

“5p : retrieve 5th “ring”

“1p…. : retrieve numeric registers one by one

:let @y=’yy@”‘ : pre-loading registers (put in .vimrc)

qqq : empty register “q”

qaq : empty register “a”

:reg .-/%:*” : the seven special registers *N*

:reg 0 : what you last yanked, not affected by a delete *N*

“_dd : Delete to blackhole, don’t affect any register *N*


” manipulating registers

:let @a=@_ : clear register a

:let @a=”” : clear register a

:let @a=@” : Save unnamed register *N*

:let @*=@a : copy register a to paste buffer

:let @*=@: : copy last command to paste buffer

:let @*=@/ : copy last search to paste buffer

:let @*=@% : copy current filename to paste buffer


” help for help (USE TAB)

:h quickref : VIM Quick Reference Sheet (ultra)

:h tips : Vim’s own Tips Help

:h visual : obtain list of all visual help topics

: Then use tab to step thru them

:h ctrl : list help of all control keys

:helpg uganda : grep HELP Files use :cn, :cp to find next

:helpgrep edit.*director: grep help using regexp

:h :r : help for :ex command

:h CTRL-R : normal mode

:h /r : what’s r in a regexp (matches a )

:h \zs : double up backslash to find zs in help

:h i_CTRL-R : help for say in insert mode

:h c_CTRL-R : help for say in command mode

:h v_CTRL-V : visual mode

:h tutor : VIM Tutor

, : Move back & Forth in HELP History

gvim -h : VIM Command Line Help

:cabbrev h tab h : open help in a tab *N*


” where was an option set

:scriptnames : list all plugins, _vimrcs loaded (super)

:verbose set history? : reveals value of history and where set

:function : list functions

:func SearchCompl : List particular function


” making your own VIM help

:helptags /vim/vim64/doc : rebuild all *.txt help files in /doc

:help add-local-help


” running file thru an external program (eg php)

map :w:!c:/php/php.exe %

map :w:!perl -c %


” capturing output of current script in a separate buffer

:new | r!perl # : opens new buffer,read other buffer

:new! x.out | r!perl # : same with named file



” create a new buffer, paste a register “q” into it, then sort new buffer

:new +put q|%!sort


” Inserting DOS Carriage Returns

:%s/$/&/g : that’s what you type

:%s/$/&/g : for Win32

:%s/$/^M&/g : what you’ll see where ^M is ONE character


” automatically delete trailing Dos-returns,whitespace

autocmd BufRead * silent! %s/[r t]+$//

autocmd BufEnter *.php :%s/[ tr]+$//e


” perform an action on a particular file or file type

autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?

autocmd FileType *.pl exec(‘set fileformats=unix’)


” Retrieving last command line command for copy & pasting into text


” Retrieving last Search Command for copy & pasting into text



” more completions

:insert name of a file in current directory


” Substituting a Visual area

” select visual area as usual (:h visual) then type :s/Emacs/Vim/ etc

:’s/Emacs/Vim/g : REMEMBER you dont type the ‘

gv : Re-select the previous visual area (ULTRA)


” inserting line number into file

:g/^/exec “s/^/”.strpart(line(“.”).” “, 0, 4)

:%s/^/=strpart(line(“.”).” “, 0, 5)

:%s/^/=line(‘.’). ‘ ‘


#numbering lines VIM way

:set number : show line numbers

:map :set number! : Show linenumbers flip-flop

:%s/^/=strpart(line(‘.’).” “,0,&ts)

#numbering lines (need Perl on PC) starting from arbitrary number

:’a,’b!perl -pne ‘BEGIN{$a=223} substr($_,2,0)=$a++’

#Produce a list of numbers

#Type in number on line say 223 in an empty file

qqmnYP`n^Aq : in recording q repeat with @q

” increment existing numbers to end of file (type as 5 characters)

:.,$g/^d/exe “normal! ”

” advanced incrementing


” advanced incrementing (really useful)

” put following in _vimrc

let g:I=0

function! INC(increment)

let g:I =g:I + a:increment

return g:I


” eg create list starting from 223 incrementing by 5 between markers a,b

:let I=223


” create a map for INC

cab viminc :let I=223 | ‘a,’bs/$/=INC(5)/


” generate a list of numbers 23-64



” editing/moving within current insert (Really useful)

: delete all entered

: delete last word

: beginning/end of line

: jump one word backwards/forwards

, : scroll while staying put in insert


#encryption (use with care: DON’T FORGET your KEY)

:X : you will be prompted for a key

:h :X


” modeline (make a file readonly etc) must be in first/last 5 lines

// vim:noai:ts=2:sw=4:readonly:

” vim:ft=html: : says use HTML Syntax highlighting

:h modeline


” Creating your own GUI Toolbar entry

amenu Modeline.Insert a VIM modeline ggOvim:ff=unix ts=4 ss=4vim60:fdm=markergg


” A function to save word under cursor to a file

function! SaveWord()

normal yiw

exe ‘:!echo ‘.@0.’ >> word.txt’


map ,p :call SaveWord()


” function to delete duplicate lines

function! Del()

if getline(“.”) == getline(line(“.”) – 1)

norm dd



:g/^/ call Del()


” Digraphs (non alpha-numerics)

:digraphs : display table

:h dig : help

ie’ : enters й

i233 : enters й (Unix)

i233 : enters й (Win32)

ga : View hex value of any character

#Deleting non-ascii characters (some invisible)

:%s/[x00-x1fx80-xff]/ /g : type this as you see it

:%s/[128-255]//gi : where you have to type the Control-V

:%s/[Ђ-я]//gi : Should see a black square & a dotted y

:%s/[128-25501-31]//gi : All pesky non-asciis

:exec “norm /[x00-x1fx80-xff]/” : same thing

#Pull a non-ascii character onto search bar

yl/” :

/[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii


” All file completions grouped (for example main_c.c)

:e main_ : tab completes

gf : open file under cursor (normal)

main_ : include NAME of file in text (insert mode)


” Complex Vim

” swap two words

:%s//=strpart(“offon”, 3 * (“off” == submatch(0)), 3)/g

” swap two words

:vnoremap `.“gvP“P

” Swap word with next word

nmap gw “_yiw:s/(%#w+)(_W+)(w+)/321/ *N*


” Convert Text File to HTML

:runtime! syntax/2html.vim : convert txt to html

:h 2html


” VIM has internal grep

:grep some_keyword *.c : get list of all c-files containing keyword

:cn : go to next occurrence


” Force Syntax coloring for a file that has no extension .pl

:set syntax=perl

” Remove syntax coloring (useful for all sorts of reasons)

:set syntax off

” change coloring scheme (any file in ~vim/vim??/colors)

:colorscheme blue

” Force HTML Syntax highlighting by using a modeline

# vim:ft=html:

” Force syntax automatically (for a file with non-standard extension)

au BufRead,BufNewFile */Content.IE?/* setfiletype html


:set noma (non modifiable) : Prevents modifications

:set ro (Read Only) : Protect a file from unintentional writes


” Sessions (Open a set of files)

gvim file1.c file2.c lib/lib.h lib/lib2.h : load files for “session”

:mksession : Make a Session file (default Session.vim)


gvim -S Session.vim : Reload all files


#tags (jumping to subroutines/functions)

taglist.vim : popular plugin

:Tlist : display Tags (list of functions)

: jump to function under cursor


” columnise a csv file for display only as may crop wide columns

:let width = 20

:let fill=’ ‘ | while strlen(fill) < width | let fill=fill.fill | endwhile

:%s/([^;]*);=/=strpart(submatch(1).fill, 0, width)/ge


” Highlight a particular csv column (put in .vimrc)

function! CSVH(x)

execute ‘match Keyword /^([^,]*,){‘.a:x.’}zs[^,]*/’

execute ‘normal ^’.a:x.’f,’


command! -nargs=1 Csv :call CSVH()

” call with

:Csv 5 : highlight fifth column


” folding : hide sections to allow easier comparisons

zf} : fold paragraph using motion

v}zf : fold paragraph using visual

zf’a : fold to mark

zo : open fold

zc : re-close fold

:help folding


” displaying “non-asciis”

:set list

:h listchars


” How to paste “normal commands” w/o entering insert mode

:norm qqy$jq


” manipulating file names

:h filename-modifiers : help

:w % : write to current file name

:w %:r.cfm : change file extention to .cfm

:!echo %:p : full path & file name

:!echo %:p:h : full path only

:!echo %:t : filename only

:reg % : display filename

% : insert filename (insert mode)

“%p : insert filename (normal mode)

/% : Search for file name in text


” delete without destroying default buffer contents

“_d : what you’ve ALWAYS wanted

“_dw : eg delete word (use blackhole)


” pull full path name into paste buffer for attachment to email etc

nnoremap :let @*=expand(“%:p”) :unix

nnoremap :let @*=substitute(expand(“%:p”), “/”, “\”, “g”) :win32


” Simple Shell script to rename files w/o leaving vim

$ vim

:r! ls *.c

:%s/(.*).c/mv & 1.bla

:w !sh



” count words in a text file



” example of setting your own highlighting

:syn match DoubleSpace ” ”

:hi def DoubleSpace guibg=#e0e0e0


” reproduce previous line word by word

imap ] @@@hhkyWjl?@@@P/@@@3s

nmap ] i@@@hhkyWjl?@@@P/@@@3s

” Programming keys depending on file type

:autocmd bufenter *.tex map :!latex %

:autocmd bufenter *.tex map :!xdvi -hush %<.dvi&


” reading Ms-Word documents, requires antiword

:autocmd BufReadPre *.doc set ro

:autocmd BufReadPre *.doc set hlsearch!

:autocmd BufReadPost *.doc %!antiword “%”


” a folding method

vim: filetype=help foldmethod=marker foldmarker=<<>>

A really big section closed with a tag <<<

— remember folds can be nested —

Closing tag >>>


” Return to last edit position (You want this!) *N*

autocmd BufReadPost *

if line(“‘””) > 0 && line(“‘””) <= line(“$”) |

exe “normal! g`”” |



” store text that is to changed,deleted in register a

“act< : Change Till < *N*


” Just Another Vim Hacker JAVH

vim -c “:%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?”




If you liked these please return to

and vote for this tip (It does encourage me!!)

Tip 305


“Read Vimtips into a new vim buffer (needs

:tabe | :r ! w3m -dump *N*


” *NEW* Tools to use with VIM to help the editing process

VimTools *N*


updated version at


Please email any errors, tips etc to

” Information Sources


Vim Wiki *N*

Vim Use VIM newsgroup *N*

comp.editors “VIM” specific newsgroup

VIM Webring

Vim Book

Searchable VIM Doc

VimTips PDF Version (PRINTABLE!)


” : commands to neutralise < for HTML display and publish

” use yy@” to execute following commands

:w!|sav! vimtips.html|:/^__BEGIN__/,/^__END__/s#<#<#g|:w!|:!vimtipsftp


Leave a Reply

Your email address will not be published. Required fields are marked *