vim奇技淫巧--向大师冲刺 发表于 2016-12-23 | 分类于 linux FROM: vimtips 有空翻译一下~ 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038__BEGIN__*vimtips.txt* For Vim version 7.3. ------------------------------------------------------------------------------" new items marked [N] , corrected items marked [C]" *best-searching*/joe/e : cursor set to End of match3/joe/e+1 : find 3rd joe cursor set to End of match plus 1 [C]/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!/\<fred\>/ : search for fred but not alfred or frederick [C]/\<\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/^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 find fred.*joe.*joe.*fred *C*/\(fred\).*\(joe\).*\2.*\1" Repeating the Regexp (rather than what the Regexp finds)/^\([^,]*,\)\{8}" visual searching:vmap // y/<C-R>"<CR> : search for visually highlighted text:vmap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : 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/<!--\_p\{-}--> : 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/^\(sub\<bar>function\)\s\+<C-R>"<CR>" 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/ : (first) search BACKWARDS!!! clever huh!" Specify what you are NOT searching for (vowels)/\c\v([^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 2nd occurrence of home in any line [U]" find str but not on lines containing tongue^\(.*tongue.*\)\@!.*nose.*$\v^((tongue)@!.)*nose((tongue)@!.)*$.*nose.*\&^\%(\%(tongue\)\@!.\)*$ :v/tongue/s/nose/&/gic'a,'bs/extrascost//gc : trick: restrict search to between markers (answer n) [N]"----------------------------------------" *best-substitution*:%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 [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#<\_.\{-1,}>##g : delete html tags possibly multi-line (non-greedy):%s#.*\(\d\+hours\).*#\1# : Delete all but memorised string (\1) [N]" parse xml/soap %s#><\([^/]\)#>\r<\1#g : split jumbled up XML file into one tag per line [N]%s/</\r&/g : simple split of html/xml/soap [N]:%s#<[^/]#\r&#gic : simple split of html/xml/soap but not closing tag [N]:%s#<[^/]#\r&#gi : parse on open xml tag [N]:%s#\[\d\+\]#\r&#g : parse on numbered array elements [1] [N]ggVGgJ : rejoin XML without extra spaces (gJ) [N]%s=\\n#\d=\r&=g : parse PHP error stack [N]:%s#^[^\t]\+\t## : Delete up to and including first tab [N]" VIM Power Substitute:'a,'bg/fred/s/dick/joe/igc : VERY USEFUL" duplicating columns:%s= [^ ]\+$=&&= : duplicate end column:%s= \f\+$=&&= : Dupicate filename:%s= \S\+$=&& : usually the same" memory:%s#example#& = &#gic : duplicate entire matched string [N]:%s#.*\(tbl_\w\+\).*#\1# : extract list of all strings tbl_* from text [NC]:s/\(.*\):\(.*\)/\2 : \1/ : reverse fields separated by ::%s/^\(.*\)\n\1$/\1/ : delete duplicate lines:%s/^\(.*\)\(\n\1\)\+$/\1/ : delete multiple duplicate lines [N]" non-greedy matching \{-}:%s/^.\{-}pdf/new.pdf/ : delete to 1st occurence of pdf only (non-greedy)%s#^.\{-}\([0-9]\{3,4\}serial\)#\1#gic : delete up to 123serial or 1234serial [N]" 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/<c-r>a/g : sub "fred" with contents of register "a":s/fred/<c-r>asome_text<c-r>s/g :s/fred/\=@a/g : better alternative as register not displayed (not *) [C]" 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/goat\|cow/sheep/gc : ORing (must break pipe):'a,'bs#\[\|\]##g : remove [] from lines between markers a and b [N]:%s/\v(.*\n){5}/&\r : insert a blank line every 5 lines [N]" Calling a VIM function:s/__date__/\=strftime("%c")/ : insert datestring:inoremap \zd <C-R>=strftime("%d%b%y")<CR> : insert date eg 31Jan11 [N]" 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:" format a mysql query :%s#\<from\>\|\<where\>\|\<left join\>\|\<\inner join\>#\r&#g" filter all form elements into paste register:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END:nmap ,z :redir @*<Bar>sil exec 'g@<\(input\<Bar>select\<Bar>textarea\<Bar>/\=form\)\>@p'<Bar>redir END<CR>" substitute string in column 30 [N]:%s/^\(.\{30\}\)xx/\1yy/" 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 <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\>#" Pull Visually Highlighted text into LHS of a substitute:vmap <leader>z :<C-U>%s/\<<c-r>*\>/" substitute singular or plural:'a,'bs/bucket\(s\)*/bowl\1/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:s#all/#&^M#|s#/#_#g|-j!" Substitute inside substitute:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/----------------------------------------" *best-global* command :g/gladiolli/# : display with line numbers (YOU WANT THIS!):g/fred.*joe.*dick/ : display all lines fred,joe & dick:g/\<fred\>/ : 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/joe/,/fred/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 (and blank lines ie whitespace):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):g/^/m$ : No effect! [N]:'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/^Chapter/t.|s/./-/g : Automatically underline selecting headings [N]: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:'a,'bg/str1/s/str1/&&&/|mo/str2/:%norm jdd : delete every other line" incrementing numbers (type <c-a> as 5 characters):.,$g/^\d/exe "norm! \<c-a>": 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:g//y A | :let @*=@a : put last glob into paste buffer [N]: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/<pattern>/z#.5 : display with context:g/<pattern>/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 <F3> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>"----------------------------------------" *Best-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:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC"----------------------------------------" create a new file for each line of file eg 1.txt,2.txt,3,txt etc:g/^/exe ".w ".line(".").".txt""----------------------------------------" chain an external command:.g/^/ exe ".!sed 's/N/X/'" | s/I/Q/ [N]"----------------------------------------" Operate until string found [N]d/fred/ :delete until fredy/fred/ :yank until fredc/fred/e :change until fred endv12| : visualise/change/delete to column 12 [N]"----------------------------------------" Summary of editing repeats [N]. last edit (magic dot):& last substitute:%& last substitute every line:%&gic last substitute every line confirmg% normal mode repeat last substituteg& 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 directionn last / or ? searchN last / or ? search in opposite direction----------------------------------------" *Absolutely-essential*----------------------------------------* # g* g# : find word under cursor (<cword>) (forwards/backwards)% : match brackets {}[](). : repeat last modification @: : repeat last : command (then @@)matchit.vim : % now matches tags <tr><td><script> <?php etc<C-N><C-P> : word completion in insert mode<C-X><C-L> : Line complete SUPER USEFUL/<C-R><C-W> : Pull <cword> onto search/command line/<C-R><C-A> : Pull <CWORD> 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:set syntax=perl : force syntax (usually taken from file extension):syntax sync fromstart : Fix syntax highlighting [N]:h regexp<C-D> : type control-D and get a list all help topics containing regexp (plus use TAB to Step thru list)----------------------------------------" MAKE IT EASY TO UPDATE/RELOAD _vimrc:nmap ,s :source $VIM/_vimrc:nmap ,v :e $VIM/_vimrc:e $MYVIMRC : edits your _vimrc whereever it might be [N]" How to have a variant in your .vimrc for different PCs [N]if $COMPUTERNAME == "NEWPC"ab mypc vistaelseab mypc dell25endif----------------------------------------" splitting windows:vsplit other.php # vertically split current file with other.php [N]----------------------------------------"VISUAL MODE (easy to add other HTML Tags):vmap sb "zdi<b><C-R>z</b><ESC> : wrap <b></b> around VISUALLY selected Text:vmap st "zdi<?= <C-R>z ?><ESC> : wrap <?= ?> around VISUALLY selected Text----------------------------------------"vim 7 tabsvim -p fred.php joe.php : open files in tabs:tabe fred.php : open fred.php in a new tab:tab ball : tab open files:close : close a tab but leave the buffer *N*" vim 7 forcing use of tabs from .vimrc:nnoremap gf <C-W>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:pwd : Print Working Directory (current directory) [N]:args *.php : open list of files (you need this!):lcd %:p:h : change to directory of current file:cd %:p:h : change to directory of current file [N]:autocmd BufEnter * lcd %:p:h : change to directory of current file automatically (put in _vimrc)----------------------------------------" Changing Caseguu : lowercase linegUU : uppercase lineVu : lowercase lineVU : uppercase lineg~~ : flip case linevEU : Upper Case WordvE~ : Flip Case WordggguG : lowercase entire file" Titlise Visually Selected Text (map for .vimrc)vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>" Title Case A Line Or Selection (better)vnoremap <F6> :s/\%V\<\(\w\)\(\w*\)\>/\u\1\L\2/ge<cr> [N]" titlise a linenmap ,t :s/.*/\L&/<bar>:s/\<./\u&/g<cr> [N]" Uppercase first letter of sentences:%s/[.!?]\_s\+\a/\U&\E/g----------------------------------------gf : open file name under cursor (SUPER):nnoremap gF :view <cfile><cr> : open file under cursor, create if necessaryga : display hex,ascii value of char under cursorggVGg? : rot13 whole fileggg?G : rot13 whole file (quicker for large file):8 | normal VGg? : rot13 from line 8:normal 10GVGg? : rot13 from line 8<C-A>,<C-X> : increment,decrement number under cursor win32 users must remap CNTRL-A<C-R>=5*5 : insert 25 into text (mini-calculator)----------------------------------------" Make all other tips superfluous:h 42 : also http://www.google.com/search?q=42:h holy-grail:h!----------------------------------------" disguise text (watch out) [N]ggVGg? : rot13 whole file (toggles):set rl! : reverse lines right to left (toggles):g/^/m0 : reverse lines top to bottom (toggles):%s/\(\<.\{-}\>\)/\=join(reverse(split(submatch(1), '.\zs')), '')/g : reverse all text *N*----------------------------------------" History, Markers & moving about (what Vim Remembers) [C]'. : jump to last modification line (SUPER)`. : jump to exact spot in last modification lineg; : cycle thru recent changes (oldest first)g, : reverse direction :changes:h changelist : help for above<C-O> : retrace your movements in file (starting from most recent)<C-I> : 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 historyq/ : 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):<C-F> : history Window (exit CTRL-C)----------------------------------------" Abbreviations & Maps" Maps are commands put onto keys, abbreviations expand typed text [N]" Following 4 maps enable text transfer between VIM sessions:map <f7> :'a,'bw! c:/aaa/x : save text to file x:map <f8> :r c:/aaa/x : retrieve text :map <f11> :.w! c:/aaa/xr<CR> : store current line:map <f12> :r c:/aaa/xr<CR> : 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<CR> : carriage Return for maps<ESC> : Escape<LEADER> : normally \<BAR> : | pipe<BACKSPACE> : backspace<SILENT> : No hanging shell window"display RGB colour under the cursor eg #445588:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>map <f2> /price only\\|versus/ :in a map need to backslash the \" type table,,, to get <table></table> ### Cool ###imap ,,, <esc>bdwa<<esc>pa><cr></<esc>pa><esc>kA" list current mappings of all your function keys:for i in range(1, 12) | execute("map <F".i.">") | endfor [N]" for your .vimrc:cab ,f :for i in range(1, 12) \| execute("map <F".i.">") \| endfor"chain commands in abbreviationcabbrev vrep tabe class.inc \| tabe report.php ## chain commands [N]----------------------------------------" Simple PHP debugging display all variables yanked into register aiab phpdb exit("<hr>Debug <C-R>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 fileyy@" : same thing using unnamed registeru@. : 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 -R : reads in output of ls:put=glob('**') : same as above [N]: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]" number lines (linux or cygwin only):new | r!nl # [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 <F5> :ls<CR>:e # : Pressing F5 lists all buffer, just type number:set hidden : Allows to change buffer w/o saving current buffer----------------------------------------" Quick jumping between splitsmap <C-J> <C-W>j<C-W>_map <C-K> <C-W>k<C-W>_----------------------------------------" Recording (BEST Feature of ALL)qq # record to qyour complex series of commandsq # end recording@q to execute@@ to Repeat5@@ to Repeat 5 timesqQ@qq : Make an existing recording q recursive [N]" editing a register/recording"qp :display contents of register q (normal mode)<ctrl-R>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 (blockwise)1) define recording/registerqq:s/ to/ from/g^Mq2) Define Visual BLOCKV}3) hit : and the following appears:'<,'>4)Complete as follows:'<,'>norm @q----------------------------------------"combining a recording with a map (to end up in command mode)"here we operate on a file with a recording, then move to the next file [N]:nnoremap ] @q:update<bar>bd----------------------------------------" Visual is the newest and usually the most intuitive editing mode" Visual basicsv : enter visual modeV : visual mode whole line<C-V> : enter VISUAL BLOCKWISE mode (remap on Windows to say C-Q *C*gv : reselect last visual area (ultra)o : navigate visual area"*y or "+y : yank visual area into paste buffer [C]V% : visualise what you matchV}J : Join Visual block (great)V}gJ : Join Visual block w/o adding spaces`[v`] : Highlight last insert:%s/\%Vold/new/g : Do a substitute on last visual area [N]----------------------------------------" Delete 8th and 9th characters of 10 successive lines [C]08l<c-v>10j2ld (use Control Q on win32) [C]----------------------------------------" how to copy a set of columns using VISUAL BLOCK" visual block (AKA columnwise selection) (NOT BY ordinary v command)<C-V> then select "column(s)" with motion commands (win32 <C-Q>)then c,d,y,r etc----------------------------------------" how to overwrite a visual-block of text with another such block [C]" move with hjkl etcPick the first block: ctrl-v move yPick the second block: ctrl-v move P <esc>----------------------------------------" text objects :h text-objects [C]daW : delete contiguous non whitespacedi< yi< ci< : Delete/Yank/Change HTML tag contentsda< ya< ca< : Delete/Yank/Change whole HTML tagdat dit : Delete HTML tag pairdiB daB : Empty a function {}das : delete a sentence----------------------------------------" _vimrc essentials:imap <TAB> <C-N> : set tab to complete [N]: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----------------------------------------set iminsert=0 (or toggle CTRL-shift-^) : reset "stuck" caps lock/capslock key [N]----------------------------------------" launching Win IE:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe file://%:p<CR>:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR>----------------------------------------" FTPing from VIMcmap ,r :Nread ftp://209.51.134.122/public_html/index.htmlcmap ,w :Nwrite ftp://209.51.134.122/public_html/index.htmlgvim ftp://www.somedomain.com/index.html # uses netrw.vim----------------------------------------" appending to registers (use CAPITAL)" yank 5 lines into "a" then add a further 5"a5yy10j"A5yy----------------------------------------[I : show lines matching word under cursor <cword> (super)----------------------------------------" Conventional Shifting/Indenting:'a,'b>>" visual shifting (builtin-repeat):vnoremap < <gv:vnoremap > >gv" Block shifting (magic)>i{>a{" also>% and <%== : index current line same as line above [N]----------------------------------------" 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 current line 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 <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p:set paste : prevent vim from formatting pasted in text *N*----------------------------------------" Re-Formatting textgq} : Format a paragraphgqap : Format a paragraphggVGgq : Reformat entire fileVgq : current line" break lines at 70 chars, if possible after a ;:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g----------------------------------------" 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 proj.zip %:p : zip all current files----------------------------------------" Command line tricksgvim -h : helpls | gvim - : edit a stream!!cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : filter a streamgvim -o file1 file2 : open into a horizontal split (file1 on top, file2 on bottom) [C]gvim -O file1 file2 : open into a vertical split (side by side,for comparing code) [N]" execute one command after opening filegvim.exe -c "/main" joe.c : Open joe.c & jump to "main"" execute multiple command on a single filevim -c "%s/ABC/DEF/ge | update" file1.c" execute multiple command on a group of filesvim -c "argdo %s/ABC/DEF/ge | update" *.c" remove blocks of text from a series of filesvim -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) e.g. for HUGE filesgvim -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 printergvim -c 's/^/\=@*/|hardcopy!|q!'" gvim's use of external grep (win32 or *nix):!grep somestring *.php : creates a list of all matching files [C]" use :cn(ext) :cp(rev) to navigate list:h grep" Using vimgrep with copen [N]:vimgrep /keywords/ *.php:copen----------------------------------------" GVIM Difference Function (Brilliant)gvim -d file1 file2 : vimdiff (compare differences)dp : "put" difference under cursor to other filedo : "get" difference under cursor from other file[c : jump backwards to change]c : jump forwards to change:set diffopt+=icase : switch case sensitivity on and off" complex diff parts of same file [N]:1,2yank a | 7,8yank b:tabedit | put a | vnew | put b:windo diffthis ----------------------------------------" Vim trapsIn 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)<C-R><C-W> : pull word under the cursor into a command line or search<C-R><C-A> : pull WORD under the cursor into a command line or search<C-R>- : pull small register (also insert mode)<C-R>[0-9a-z] : pull named registers (also insert mode)<C-R>% : pull file name (also #) (also insert mode)<C-R>=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 register "_ , 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<C-D><tab> : obtain list of all visual help topics : Then use tab to step thru them:h ctrl<C-D> : 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 <CR>):h \\zs : double up backslash to find \zs in help:h i_CTRL-R : help for say <C-R> in insert mode:h c_CTRL-R : help for say <C-R> in command mode:h v_CTRL-V : visual mode:h tutor : VIM Tutor<C-]> : jump to {keyword} under cursor in help file [C]<C-[>, <C-T> : Move back & Forth in HELP Historygvim -h : VIM Command Line Help:cabbrev h tab help : 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" save this page as a VIM Help File [N]:sav! $VIMRUNTIME/doc/vimtips.txt|:1,/^__BEGIN__/d|:/^__END__/,$d|:w!|:helptags $VIMRUNTIME/doc----------------------------------------" running file thru an external program (eg php)map <f9> :update<CR>:!c:/php/php.exe %<CR>map <f2> :update<CR>:!perl -c %<CR>----------------------------------------" 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:new+read!ls----------------------------------------" create a new buffer, paste a register "q" into it, then sort new buffer:new +put q|%!sort----------------------------------------" Inserting DOS Carriage Returns:%s/$/\<C-V><C-M>&/g : that's what you type:%s/$/\<C-Q><C-M>&/g : for Win32:%s/$/\^M&/g : what you'll see where ^M is ONE character----------------------------------------" automatically delete trailing Dos-returns,whitespaceautocmd BufRead * silent! %s/[\r \t]\+$//autocmd BufEnter *.php :%s/[ \t\r]\+$//e----------------------------------------" perform an action on a particular file or file typeautocmd VimEnter c:/intranet/note011.txt normal! ggVGg?autocmd FileType *.pl exec('set fileformats=unix')----------------------------------------" Retrieving last command line command for copy & pasting into texti<c-r>:" Retrieving last Search Command for copy & pasting into texti<c-r>/----------------------------------------" more completions<C-X><C-F> :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 <F12> :set number!<CR> : 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 fileqqmnYP`n^Aq : in recording q repeat with @q" increment existing numbers to end of file (type <c-a> as 5 characters):.,$g/^\d/exe "normal! \<c-a>"" advanced incrementinghttp://vim.sourceforge.net/tip_view.php?tip_id=150----------------------------------------" *advanced incrementing* (really useful)" put following in _vimrclet g:I=0function! INC(increment)let g:I =g:I + a:incrementreturn g:Iendfunction" eg create list starting from 223 incrementing by 5 between markers a,b:let I=223:'a,'bs/^/\=INC(5)/" create a map for INCcab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/----------------------------------------" *generate a list of numbers* 23-64o23<ESC>qqYp<C-A>q40@qunmap = : get the original vim command on a mapped key [N]----------------------------------------" editing/moving within current insert (Really useful)<C-U> : delete all entered<C-W> : delete last word<HOME><END> : beginning/end of line<C-LEFTARROW><C-RIGHTARROW> : jump one word backwards/forwards<C-X><C-E>,<C-X><C-Y> : 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 entryamenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>vim60:fdm=marker<esc>gg----------------------------------------" A function to save word under cursor to a filefunction! SaveWord() normal yiw exe ':!echo '.@0.' >> word.txt'endfunctionmap ,p :call SaveWord()----------------------------------------" function to delete duplicate linesfunction! Del() if getline(".") == getline(line(".") - 1) norm dd endifendfunction:g/^/ call Del()----------------------------------------" Digraphs (non alpha-numerics):digraphs : display table:h dig : helpi<C-K>e' : enters éi<C-V>233 : enters é (Unix)i<C-Q>233 : enters é (Win32)ga : View hex value of any character#Deleting non-ascii characters (some invisible):%s/[\x00-\x1f\x80-\xff]/ /g : type this as you see it:%s/[<C-V>128-<C-V>255]//gi : where you have to type the Control-V:%s/[€-ÿ]//gi : Should see a black square & a dotted y:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi : All pesky non-asciis:exec "norm /[\x00-\x1f\x80-\xff]/" : same thing#Pull a non-ascii character onto search baryl/<C-R>" :/[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii----------------------------------------" All file completions grouped (for example main_c.c):e main_<tab> : tab completesgf : open file under cursor (normal)main_<C-X><C-F> : include NAME of file in text (insert mode)----------------------------------------" Complex Vim" swap two words:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g" swap two words:vnoremap <C-X> <Esc>`.``gvP``P" Swap word with next wordnmap <silent> gw "_yiw:s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/<cr><c-o><c-l> [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:colorscheme morning : good fallback colorscheme *N*" 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" make cursor standout against highlighted text for vim terminal (linux) [N]:highlight search term=reverse ctermbg=5 :highlight Normal guibg=white : restore white background [N]----------------------------------------: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):mksession MySession.vim : Make a Session file named file [C]:qgvim -S : Reload all files (loads Session.vim) [C]gvim -S MySession.vim : Reload all files from named session [C]----------------------------------------#tags (jumping to subroutines/functions)taglist.vim : popular plugin:Tlist : display Tags (list of functions)<C-]> : 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:%s/\s\+$//ge" Highlight a particular csv column (put in .vimrc)function! CSVH(x) execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/' execute 'normal ^'.a:x.'f,'endfunctioncommand! -nargs=1 Csv :call CSVH(<args>)" call with:Csv 5 : highlight fifth column----------------------------------------zf1G : fold everything before this line [N]" folding : hide sections to allow easier comparisonszf} : fold paragraph using motionv}zf : fold paragraph using visualzf'a : fold to markzo : open foldzc : re-close fold" also visualise a section of code then type zf [N]:help foldingzfG : fold everything after this line [N]----------------------------------------" displaying "non-asciis":set list:h listchars----------------------------------------" How to paste "normal vim 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<C-R>% : insert filename (insert mode)"%p : insert filename (normal mode)/<C-R>% : 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 etcnnoremap <F2> :let @*=expand("%:p")<cr> :unixnnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32----------------------------------------" Simple Shell script to rename files w/o leaving vim$ vim:r! ls *.c:%s/\(.*\).c/mv & \1.bla:w !sh:q!----------------------------------------" count words/lines in a text fileg<C-G> # counts words:echo line("'b")-line("'a") # count lines between markers a and b [N]:'a,'bs/^//n # count lines between markers a and b:'a,'bs/somestring//gn # count occurences of a string:s/,/,/gn # count commas in a line (csv/parameters)----------------------------------------" example of setting your own highlighting:syn match DoubleSpace " ":hi def DoubleSpace guibg=#e0e0e0----------------------------------------" reproduce previous line word by wordimap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3snmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s" Programming keys depending on file type:autocmd bufenter *.tex map <F1> :!latex %<CR>:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>" allow yanking of php variables with their dollar [N]:autocmd bufenter *.php :set iskeyword+=\$ ----------------------------------------" reading Ms-Word documents, requires antiword (not docx):autocmd BufReadPre *.doc set ro:autocmd BufReadPre *.doc set hlsearch!:autocmd BufReadPost *.doc %!antiword "%"----------------------------------------" a folding methodvim: 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`\"" | \ endif----------------------------------------" store text that is to be changed or deleted in register a"act< : Change Till < [N]----------------------------------------"installing/getting latest version of vim on Linux (replace tiny-vim) [N]yum install vim-common vim-enhanced vim-minimal----------------------------------------# using gVIM with Cygwin on a Windows PCif has('win32')source $VIMRUNTIME/mswin.vimbehave mswinset shell=c:\\cygwin\\bin\\bash.exe shellcmdflag=-c shellxquote=\"endif----------------------------------------" *Just Another Vim Hacker JAVH*vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"----------------------------------------vim:tw=78:ts=8:ft=help:norl:__END__----------------------------------------"Read Vimtips into a new vim buffer :silent r ! lynx -dump "http://zzapper.co.uk/vimtips.html" [N]" read webpage source html into vimgvim http://www.zzapper.co.uk/vimtips.html &----------------------------------------updated version at http://www.zzapper.co.uk/vimtips.html----------------------------------------Please email any errors, tips etc tovim@rayninfo.co.uk" Information Sources----------------------------------------www.vim.orgVim Wiki *** VERY GOOD *** [N]Vim Use VIM newsgroup [N]comp.editorsgroups.yahoo.com/group/vim "VIM" specific newsgroupVIM WebringVimTips PDF Version (PRINTABLE!)Vimtips in Belarusian ----------------------------------------" : commands to neutralise < for HTML display and publish" use yy@" to execute following commands:w!|sav! vimtips.html|:/^__BEGIN__/,/^__END__/s#<#\<#g|:w!|:!vimtipsftp----------------------------------------