__BEGIN__ ------------------------------------------------------------------------------ # 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.*fred.*bill/ : normal /^[A-J]\+/ : search for lines beginning with one or more A-J /begin\_.*end : search over possible multiple lines /fred\_s*joe/i : any whitespace including newline /fred\|joe : Search for FRED OR JOE /.*fred\&.*joe : Search for FRED AND JOE in any ORDER! /\/i : search for fred but not alfred or frederick /\<\d\d\d\d\> : Search for exactly 4 digit numbers /\D\d\d\d\d\D : Search for exactly 4 digit numbers /\<\d\{4}\> : same thing /\([^0-9]\|^\)%.*% : Search for absence of a digit or beginning of line # finding empty lines /^\n\{3} : find 3 empty lines # using rexexp memory in a search /\(fred\).*\(joe\).*\2.*\1 # Repeating the Regexp (rather than what the Regexp finds) /^\([^,]*,\)\{8} # visual searching :vmap // y/" : search for visually highlighted text :vmap // y/=escape(@", '\\/.*$^~[]') : with spec chars # \zs and \ze regex delimiters :h /\zs /<\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/i : any whitespace including newline /bugs\(\_.\)*bunny : bugs followed by bunny anywhere in file :h \_ : help # search for declaration of subroutine/function under cursor :nmap gx yiw/^\(sub\function\)\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 ?http://www.vim.org/ : search BACKWARDS!!! clever huh! # Specify what you are NOT searching for (vowels) /\c\v([^aeiou]&\a){4} : search for 4 consecutive consonants ---------------------------------------- #substitution :%s/fred/joe/igc : general substitute command :%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 # IF YOU ONLY WANT TO KNOW ONE THING :'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/\(.*\):\(.*\)/\2 : \1/ : reverse fields separated by : :%s/^\(.*\)\n\1$/\1/ : delete duplicate lines # non-greedy matching \{-} :%s/^.\{-}pdf/new.pdf/ : delete to 1st pdf only # use of optional atom \? :%s#\<[zy]\?tbl_[a-z_]\+\>#\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/ # ORing :%s/suck\|buck/loopy/gc : ORing (must break pipe) # Calling a VIM function :s/__date__/\=strftime("%c")/ : insert datestring # Working with Columns sub any str1 in col3 :%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2: # Swapping first & last column (4 columns) :%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1: # filter all form elements into paste register :redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END :nmap ,z :redir @*sil exec 'g@<\(input\select\textarea\/\=form\)\>@p'redir END # decrement numbers by 3 :%s/\d\+/\=(submatch(0)-3)/ # increment numbers by 6 on certain lines only :g/loc\|function/s/\d/\=submatch(0)+6/ # better :%s#txtdev\zs\d#\=submatch(0)+1#g :h /\zs # increment only numbers gg\d\d by 6 (another way) :%s/\(gg\)\@<=\d\+/\=submatch(0)+6/ :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/xx\zsyy\ze/\=i/ |let i=i+1 # convert xxyy to xx11,xx12,xx13 # find replacement text, put in memory, then use \zs to simplify substitute :%s/"\([^.]\+\).*\zsxx/\1/ # 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/\<*\>/ ---------------------------------------- # 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 :s#all/#&^M#|s#/#_#g|-j! # Substitute inside substitute :%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/ ---------------------------------------- # global command display (see tip 227) :g/fred.*joe.*dick/ : display all lines fred,joe & dick :g/\/ : display all lines fred but not freddy :g//z#.5 : display with context :g//z#.5|echo "==========" : display beautifully :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/-------/.-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/./.,/./-1join : compress empty lines :g/^$/,/./-j : compress empty lines :g/ 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. :g/fred/y A : append all lines fred to register a :'a,'b g/^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.ex | -d ---------------------------------------- # Global combined with substitute (power editing) :'a,'bg/fred/s/joe/susan/gic : can use memory to extend matching :g/fred/,/joe/s/fred/joe/gic : non-line based (ultra) ---------------------------------------- # Find fred before beginning search for joe :/fred/;/joe/-2,/sid/+3s/sally/alley/gIC ---------------------------------------- # Absolutely essential ---------------------------------------- * # g* g# : find word under cursor () (forwards/backwards) % : match brackets {}[]() . : repeat last modification matchit.vim : % now matches tags