multiple-cursors[多光标操作]
ctrl+n 选中一个
ctrl+p 放弃一个, 回到上一个
ctrl+x 跳过当前选中, 选中下一个
esc 退出
选中后, 可以进行增删替换a/c/x等
去掉utf-8文件中的bom
file *
1: UTF-8 Unicode text2: UTF-8 Unicode (with BOM) text
bom:UTF-8签名(UTF-8 signature)也叫做BOM(Byte Order Mark)
用vim去除utf-8 BOM
1.去掉utf-8 BOM
:set nobomb
2.保留utf-8 BOM
:set bomb
在VS中定义快捷键启动GVIM的批处理命令
start /b gvim.exe --servername VS_NET --remote-silent "%1" "%2":%s/^.*doc$//g "在缓冲区内删除以doc结尾的行
:%s/^.*[txt,doc]$//g "在缓冲区内删除以txt和doc结尾的行
:v/./d "删除空行
:so % "加载当前缓冲区的vim脚本源码
:w "保存
:wq "保存并退出
normal / 搜索
normal ?反向搜索
zM 关闭所有折叠
zA 打开所有折叠
:set nofen 禁用所有折叠
:copen 打开quickfix
:cclose 关闭quickfix
:cc [number] 用当前窗口打开quickfix中第number行批定的文件和相应的行和列
:cp 用当前缓冲区打开quickfix中上一行
:cn 用当前缓冲区quickfix中下一行
:cw 如果quickfix中有错误则打开
:col 回到旧的错误列表
:cnew 到更新的错误列表
格式化全文: gg=G
自动缩进当前行: ==
格式化当前光标接下来的10行: 10==
格式化选定的行: v (向上下选择)=
:cd 显示当前路径
:set noma 不允许修改
:set ma 允许修改
"ayy 复制当前行文本到寄存器a
"ap 输出a寄存器到当前光标后
dit 删除<div>...</div>不包括标签
dat 删除<div>...</div>包括标签
>at 缩进一个div
--------------------------------------------------------------
vimrc下添加
runtime macros/matchit.vim
filetype plugin on
% 光标在<div>和</div>之间跳转
--------------------------------------------------------------
以下引自http://www.rayninfo.co.uk/vimtips.html
_BEGIN__ *vimtips.txt* For Vim version 8.0. ------------------------------------------------------------------------------ " new items marked [N] , corrected items marked [C] " *best-searching* /joe/e : cursor set to End of match 3/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] /integ<C-L> : Control-L to complete search term [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] :s/fred/\=@*/g : replace string with contents of paste register [N] " 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 f