" 搜索 /joe/e : 设置光标到匹配"joe"的末尾 /joe/e+1 : 设置光标到匹配"joe"的末尾再后移一位 /joe/s-2 : 设置光标到匹配"joe“的开头再前移两位 /^joe.*fred.*bill/ : 匹配以'j'开头且"joe"到"fred"到"bill"之间至少有一个字符 /^[A-J]\+/ : 搜索'A'到’J‘重复两次以上的开头行 /begin\_.*end : 多行匹配 /fred\_s*joe/i : 可以是任何空白字符包括\n,\t等等 /fred\|joe : 搜索fred或者joe /.*fred\&.*joe : 搜索同时包括fred跟joe的行 /\<fred\>/i : 搜索独立的单词fred /\<\d\d\d\d\> : 搜索独立的4位数字 /\D\d\d\d\d\D : 搜索6位字符串中间4位数字前后两位不能为数字 /\<\d\{4}\> : 同/\<\d\d\d\d\> " 查找空行 /^\n\{3} : 匹配三连续的空行 " 使用正则表达式组查找 /\(fred\).*\(joe\).*\2.*\1 " 正则表达式重复 /^\([^,]*,\)\{8} " visual searching :vmap // y/<C-R>"<CR> : visually模式下的键盘映射,把//映射成匹配当前选中的文本 :vmap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : 包括空白字符 " \zs 和 \ze 匹配原 :h /\zs /<\zs[^>]*\ze> : 匹配尖括号中的内容 " 零宽度匹配 :h /\@= /<\@<=[^>]*>\@= : search for tag contents, ignoring chevrons /<\@<=\_[^>]*>\@= : search for tags across possible multiple lines " 多行查找 \_ 的意思是包括换行符 /<!--\_p\{-}--> : 匹配<!--开始到-->结尾的所有内容 /fred\_s*joe/i : 匹配fred开始到joe,之间一定得是空白字符 /bugs\(\_.\)*bunny : 匹配所有bugs到bunny的字符串 :h \_ : help " 查找函数声明,nmap为normal模式下的键盘映射 :nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR> " 查找多个文件 :bufdo /searchstr/ : 在多个文件缓冲区里执行查找 " 更好的多文件查找定位方法 :bufdo %s/searchstr/&/gic : 在多个文件缓冲区里查找,按下n停止 " 怎样不使用 / 来查找网址 ?http://www.vim.org/ : 向后查找 " 查找指定字符以外的字符串 /\c\v([^aeiou]&\a){4} : 查找4个辅音字母 ---------------------------------------- #替换 :%s/fred/joe/igc : 普通替换命令 :%s/\r//g : 删除 DOS 的换行符 ^M " 你的文本文件是否乱七八糟的排成一行?使用如下命令 :%s/\r/\r/g : 转换 DOS 回车符 ^M 为真正的回车符 :%s= *$== : 删除行尾空白 :%s= \+$== : 同上 :%s#\s*\r\?$## : 删除尾部空白和dos换行符 :%s#\s*\r*$## : 同上 " 删除空行 :%s/^\n\{3}// : 删除连续3个空行 :%s/^\n\+/\r/ : 压缩空行,多个替换为一个 %s#<[^>]\+>##g : 删除html的tag部分 " IF YOU ONLY WANT TO KNOW ONE THING :'a,'bg/fred/s/dick/joe/igc : 非常有用 # 译释:''a,''b指定一个范围:mark a ~ mark b # g//用一个正则表达式指出了进行操作的行必须可以被fred匹配 # 看后面,g//是一个全局显示命令 # s/dick/joe/igc则对于这些满足条件的行进行替换 " 复制列 :%s= [^ ]\+$=&&= : 复制最后一列 :%s= \f\+$=&&= : 一样 :%s= \S\+$=&& : 晕,还一样! " 记忆(反向引用) :s/\(.*\):\(.*\)/\2 : \1/ : 将两个字段颠倒 :%s/^\(.*\)\n\1$/\1/ : 删除重复行 " 非贪婪匹配 \{-} :%s/^.\{-}pdf/new.pdf/ : 删除第一个pdf " use of optional atom \? :%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : lowercase with optional leading characters " 跨越尽量多的行 :%s/<!--\_.\{-}-->// : 删除多行注释 :help /\{-} : 查看非贪婪匹配的更多帮助 " 使用寄存器替换 :s/fred/<c-r>a/g : 将fred替换为寄存器a里的内容 :s/fred/<c-r>asome_text<c-r>s/g :s/fred/\=@a/g : better alternative as register not displayed " 在一行里写多种命令 :%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/ :%s/a/but/gie|:update|:next : 当使用 @: 来重复 " 或运算 :%s/suck\|buck/loopy/gc : 替换suck或者buck(这里|不是管道) " 调用vim函数 :s/__date__/\=strftime("%c")/ : 将__date__替换成当前日期,使用strftime函数 " 处理列,替换所有在第三列中的str1 :%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2: " 交换第一列跟第四列 :%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1: " 过滤form中的内容放在寄存器里 :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> " 两位以上的数字减三(带进位。这个命令挺有趣) :%s/\d\+/\=(submatch(0)-3)/ " 包含loc或者functions的行中的数字加6 :g/loc\|function/s/\d/\=submatch(0)+6/ " 比上面更好的方法 :%s#txtdev\zs\d#\=submatch(0)+1#g :h /\zs 查看帮助 " 前缀为gg的数字加6 :%s/\(gg\)\@<=\d\+/\=submatch(0)+6/ :h zero-width 查看帮助 " 替换一个特定字符串为数字 :let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 # 将yy转换成10,11,12等等 " 比上面的更精确 :let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 # 将xxyy 转换成 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>*\>/ ---------------------------------------- " 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')/ ---------------------------------------- " 全局显示命令 :g/gladiolli/# : 查找并显示匹配的行号 :g/fred.*joe.*dick/ : 显示所有含有 fred,joe & dick的行 :g/\<fred\>/ : 显示单一单词fred :g/^\s*$/d : 删除所有空行 :g!/^dd/d : 删除不含字符串''dd''的行 :v/^dd/d : 同上 :g/fred/,/joe/d : 删除所有的从fred到joe :g/-------/.-10,.d : 以-------为标记删除之前的10行 :g/{/ ,/}/- s/\n\+/\r/g : 删除 {...}之间的空行 :v/\S/d : Delete empty lines (both types) :v/./,/./-j : 压缩空行 :g/^$/,/./-j : 同上 :g/<input\|<form/p : 或运算 :g/^/put_ : 双倍行宽 (pu = put) :g/^/m0 : 颠倒文件 (m = move) :'a,'bg/^/m'b : 颠倒选中的 a 到 b :g/^/t. : 重复行 :g/fred/t$ : 拷贝行从fred到结尾 :g/stage/t'a : 拷贝行从stage 到 marker a(a为标记的位置) :g/\(^I[^^I]*\)\{80}/d : 删除最少包含80个tab的行 " 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 : 隔行删除 " 增加数字 (键入 <c-a>) :.,$g/^\d/exe "norm! \<c-a>": 增加从当前行首到结尾的数字 :'a,'bg/\d\+/norm! ^A : 增加数字 " 保存全局命令的结果 (注意必须使用添加模式) 你需要使用 qaq 清空寄存器a. "save results to a register/paste buffer 存储结果到 寄存器/粘贴 到 a :g/fred/y A : 添加配备行到寄存器到 a :g/fred/y A | :let @*=@a : 放入复制缓冲区 :let @a=''|g/Barratt/y A |:let @*=@a :'a,'b g/^Error/ . w >> errors.txt " 复制每一行,然后在复制出来的每一行两侧加上一个 print '复制出来的内容' :g/./yank|put|-1s/'/"/g|s/.*/Print '&'/ " 用文件中的内容替换字符串,-d 表示删除“标记” :g/^MARK$/r tmp.ex | -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> ---------------------------------------- " 全局命令和替换命令联姻 (强大的编辑能力) :'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用来匹配 :g/fred/,/joe/s/fred/joe/gic : non-line based (ultra) ---------------------------------------- " 先找fred,然后找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" ---------------------------------------- " Absolutely essential ---------------------------------------- * # g* g# : 查找当前光标下的单词(单个单词) (<cword>) (向前/向后) % : 匹配括号 {}[]() . : 重复上次操作 @: : 重复上次的命令 matchit.vim : 适%能匹配 <script> <?php等标记 <C-N><C-P> : 插入模式下自动完成填词 <C-X><C-L> : 行自动完成(超级有用) /<C-R><C-W> : 把单个<cword>单词放入搜索或者命令行 /<C-R><C-A> : 把字符串中有的单词<CWORD>放入搜索或者命令行 :set ignorecase : 忽略大小写 :syntax on : 打开语法高亮 Perl,HTML,PHP 等等 :h regexp<C-D> : 按ctrl+d得到包含regexp的列表 (按tab自动不齐) ---------------------------------------- " 简单编辑更新 _vimrc文件 :nmap ,s :source $VIM/_vimrc :普通模式下的键盘映射 ,s映射成加载用户目录下的 _vimrc文件 :nmap ,v :e $VIM/_vimrc :,v映射成打开_vimrc文件 ---------------------------------------- #VISUAL 模式 (方便增加 HTML 标签) :vmap sb "zdi<C-R>z<ESC> : 在 VISUALLY模式下将选中的文本前后分别加上 :vmap st "zdi<?= <C-R>z ?><ESC> : 加上 <?= ?> ---------------------------------------- " 浏览 :Exp(lore) : 浏览文件 :Sex(plore) : 分割窗口浏览文件 :ls : 显示缓冲区 :cd .. : 设置当前目录位置 :args : 查看当前打开的所有文件 :lcd %:p:h : 改变路径到当前编辑的文件 :autocmd BufEnter * lcd %:p:h : 放入.vimrc自动完成上面的命令 ---------------------------------------- " 缓冲区浏览(一直排名前10的vim脚本) " 需要 bufexplorer.vim http://www.vim.org/script.php?script_id=42 \be : 缓冲浏览器中查看缓冲列表 \bs : 同上,但是分割窗口 ---------------------------------------- " 转换大小写 guu : 将正行的字母转换成小写 gUU : 将正行的字母转换成大写 Vu : 转换选中的行(小写) VU : 转换选中的行(大写) g~~ : 反向转换 vEU : 转换词大写 vE~ : 反向转换词 ggguG : 将当前编辑文件内容全部转换成小写 " Visually 模式下选择所有的字母及数字 (放入 .vimrc文件中) vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR> " 大写所有句子的第一个字母 :%s/[.!?]\_s\+\a/\U&\E/g ---------------------------------------- gf : 打开当前光标下或后的文件 :nnoremap gF :view <cfile><cr> : 打开当前光标下或后的文件, 如果不存在则创建 ga : 显示当前光标下单个字的ascii,十进制,十六进制…… ggVGg? : 将整个文件用rot13编码……(谁看得懂啊~~hoho) ggg?G : 同上 (针对大文件) :8 | normal VGg? : 将第八行用rot13编码 :normal 10GVGg? : 同上 <C-A>,<C-X> : 增加,减少当前光标下的数字 win32 用户需要重定义 CNTRL-A <C-R>=5*5 : 插入25 (小型计算器) ---------------------------------------- " 几个彩蛋…… :h 42 : also http://www.google.com/search?q=42 :h holy-grail :h! ---------------------------------------- " 标记 & 移动 '. : 跳回最后编辑的行 (超有用) `. : 同上,但是定位编辑点 g; : 跳转到比较旧的编辑位置(如果有的话) (vim6.3后的新功能) g, : 这个是较心的位置 (同上) :changes :打出改变表 :h changelist : 查看“改变表跳转”的帮助 <C-O> : 依次沿着你的跳转记录向回跳 (从最近的一次开始) <C-I> : 依次沿着你的跳转记录向前跳 :ju(mps) : 列出跳转轨迹 :help jump-motions :history : 列出历史记录 :his c : 命令行历史 :his s : 搜索历史 q/ : 搜索命令历史的窗口 q: : 命令行命令历史的窗口 :<C-F> : 历史窗口 ---------------------------------------- " 缩写 & 映射 :map <f7> :'a,'bw! c:/aaa/x :map <f8> :r c:/aaa/x :map <f11> :.w! c:/aaa/xr<CR> :map <f12> :r c:/aaa/xr<CR> :ab php : 查看以php开头的缩写 :map , : 列出所有的映射(以逗号开始的) " 允许映射 F10 (win32) set wak=no : :h winaltkeys " 映射中常使用的表示 <CR> : 回车 <ESC> : Esc <LEADER> : 右斜杠 <BAR> : 管道符号 <BACKSPACE> : 退格键 <SILENT> : 不回显 #显示自定义的 RGB 颜色显示当前光标下的字符串 例如 #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 \ ---------------------------------------- " Simple PHP debugging display all variables yanked into register a " 简单的 PHP 调试将所有显示的变量放入寄存器a iab phpdb exit("<hr>Debug <C-R>a "); ---------------------------------------- " 使用寄存器来映射 (放入 .vimrc文件自动加载) :let @m=":'a,'bs/" :let @s=":%!sort -u" ---------------------------------------- " 列出寄存器 :reg : 显示当前所有的寄存器 :reg a : 显示寄存器a中的内容 "1p.... : 引用一个叫1的寄存器 :let @y='yy@"' : pre-loading registers (put in .vimrc) qqq : 清空寄存器 "q" ---------------------------------------- " 一些有用的决窍 "ayy@a : 把当前行作为命令执行 yy@" : 上面的匿名寄存器 u@. : 只执行键入的命令 ---------------------------------------- " 从其它命令处获得输入(需要外部命令) :r!ls.exe : 从ls 获得输入插入到当前位置 !!date : 从date获得输入(删除当前行) " 使用外部sort排序 :%!sort -u : 用sort排序整个文件(结果覆盖整个文件) :'a,'b!sort -u : 从mark a到mark b之间的内容进行排序 !1} sort -u : 排序一个段落 :g/^$/;,/^$/-1!sort : Sort each block (note the crucial ---------------------------------------- " 多文件管理 (基本的) :bn : 跳转到下一个buffer :bp : 跳转到前一个buffer :wn : 保存当前buffer并跳转到下一个buffer (超有用) :wp : 保存当前buffer并跳转到前一个buffer :bd : 把当前文件从buffer移出 (超有用) :bun : 卸载当前buffer (关闭这个窗口但是不移出) :badd file.c : 添加file.c到buffer列表 :b 3 : 前往第三个 buffer :b main : 前往含有main的buffer中 比如说 main.c :sav php.html : 把当前文件存为php.html并打开 :sav! %<.bak : 换一个后缀名保存 (旧方法) :sav! %:r.cfm : 同上 :sav %:s/fred/joe/ : 替换文件名 :sav %:s/fred/joe/:r.bak2 : 替换文件和后缀 :!mv % %:r.bak : 重命名当前文件 :e! : 打开未修改之前的文件 :w c:/aaa/% : 存储文件到指定位置 :e # : 编辑标记为#的文件在buffer中 :rew : 返回到第一个可编辑的文件 :brew : 回到第一个buffer :sp fred.txt : 分割窗口打开fred.txt :sball,:sb : 把所有的 buffers分割显示在一个窗口中 (超有用) :scrollbind : in each split window :map <F5> :ls<CR>:e # : 按F5显示所有buffer, 并显示行号 :set hidden : 允许不保存当前buffer而进行切换 ---------------------------------------- " 在分割窗口中快速切换 map <C-J> <C-W>j<C-W>_ map <C-K> <C-W>k<C-W>_ ---------------------------------------- " 录制命令 (最好的技巧) qq # 录制命令放入 q寄存器 输入一些命令 q # 录制结束 @q :执行放入寄存器q中的内容 @@ :重复 5@@ :重复5次 " 编辑一个 寄存器/录制 "qp :显示寄存器q中的内容(普通模式下) <ctrl-R>q :显示寄存器q中的内容 (插入模式下) " 你现在可以看到记录内容,随便编辑 "qdd :删除,重新存入q @q :执行 录制/寄存器 q " 在可视块中运行记录 1) 定义记录/寄存器 qq:s/ to/ from/g^Mq 2) 定义可视块 V} 3) 键入 : 将显示下面信息 :'<,'> 4)完成如下操作 :'<,'>norm @q ---------------------------------------- "combining a recording with a map (to end up in command mode) nnoremap ] @q:w!<bar>bd ---------------------------------------- " 可视化模式提供一种灵活易用的方法选择一块文本供操作符使用 " 记出 v : 进入可视化模式 V : 进入可视化行选择模式 <C-V> : 进入可视化块选择模式 gv : 重新选择 o : 选择的区域头尾移动 "*y : 复制选择区域到paste buffer V% : 选择一个匹配段 V}J : 合并一个段落 V}gJ : 合并一个段落,并保留空格 ---------------------------------------- " 删除选中的10行的前两个字符(不过这里应该假设是紧凑的排版格式,不能包含空格、 tab等字符的,可是经实验应该是钱3个字符才对啊??) 0<c-v>10j2ld ---------------------------------------- " 如何用可视块拷贝几列 " 可视块(并非通常的 v 命令) <C-V>,然后通过移动命令选择列 (win32 <C-Q>) 然后执行 c,d,y,r 等命令 ---------------------------------------- " how to overwrite a visual-block of text with another such block Pick the first block: ctrl-v move "ay Pick the second block: ctrl-v move c ctrl-o "aP <esc> ---------------------------------------- " _vimrc 基本设置 :set incsearch : 输入搜索命令时,立即显示目前输入的模式对应的匹配。匹配的字符串 被高亮。 :set wildignore=*.o,*.obj,*.bak,*.exe : tab补全时忽略这些忽略这些 :set shiftwidth=3 : 设置自动缩进为3个字符 :set vb t_vb=". : 安静模式,关闭响铃跟闪烁 :set browsedir=buffer : 设置文件浏览使用的目录 “注: ”last 使用文件浏览器最近访问相同的目录。 “buffer 使用相关缓冲区的目录。 ”current 使用当前目录。 “{path} 使用指定目录。 ---------------------------------------- " 启动windows中的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> ---------------------------------------- " 在vim里打开ftp cmap ,r :Nread ftp://209.51.134.122/public_html/index.html cmap ,w :Nwrite ftp://209.51.134.122/public_html/index.html gvim ftp://www.somedomain.com/index.html # 使用 netrw.vim ---------------------------------------- " 向寄存器中添加内容 (使用相应寄存器名称的大写) " 复制5行放入a寄存器,然后向下跳转10行再复制5行 "a5yy 10j "A5yy ---------------------------------------- [I : 显示当前行中字符的所有匹配(超级有用) ---------------------------------------- " 常规缩进 :'a,'b>> :将mark a到mark b之间的内容进行两次缩进 " 虚拟模式下缩进 (可重复) :vnoremap < <gv ”这是一个虚拟模式下的键盘映射 < 映射为<gv "< 意为向内缩进,gv 上面已有解释,为重复上次选区 “<gv 也就是先向内缩进然后再选择刚才的选区 “这样就可以只按 < 实现重复缩进了 :vnoremap > >gv :向内缩进,原理同上 " 块缩进 >i{ >a{ " also >% and <% ”自己试试看吧,涉及到用 { 的语言很有用,比如c,c++等 ---------------------------------------- " 重定向 & 粘贴到寄存器 * (*为寄存器名称) :redir @* : 重定向命令到paste缓冲区 :redir END : 结束 :redir >> out.txt : 重定向到文件 " 操作粘贴缓冲区 "*yy : 复制到寄存器 "*p : 从寄存器中粘贴一行 " 复制到粘贴缓冲区 (扩展模式) :'a,'by* : 复制一个范围到粘贴寄存器 :%y* : 复制一个括号匹配到粘贴缓冲区 :.y* : 复制当前行到粘贴缓冲区 " 从剪贴板上过滤非可打印字符 " 当从一些 GUI 程序粘贴时会有用处 :nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p ---------------------------------------- " 重新格式化文本 gq} : 合并一个段落 gqap : 当前段落 ggVGgq : 全部段落 Vgq : 当前行 " 在70列的时候换行 :s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g ---------------------------------------- " 命令使用于多个文件 :argdo %s/foo/bar/e : 在所有文件上操做 :args :bufdo %s/foo/bar/e :windo %s/foo/bar/e :argdo exe '%!sort'|w! : 包含外部命令 ---------------------------------------- " 命令行技巧 gvim -h : 显示帮助 ls | gvim - : 管道操作 cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : 从管道出过滤内容 gvim -o file1 file2 : 分割窗口显示两个文件 " 打开文件后执行一条命令 gvim.exe -c "/main" joe.c : 打开 joe.c & 跳转到 "main" " 在打开一个文件时执行多条命令 vim -c "%s/ABC/DEF/ge | update" file1.c " 在一组文件上执行多条命令 vim -c "argdo %s/ABC/DEF/ge | update" *.c " 从一系列文件中删除一块区域 vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c " 自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了) vim -s "convert.vim" file.c #不加载.vimrc跟任何plugin(干净清新的 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 " 将paste中的内容送往默认的打印机 gvim -c 's/^/\=@*/|hardcopy!|q!' " gvim 里的 grep (win32 or *nix) :grep somestring *.php : 创建匹配的文件列表 " 使用 :cn(向后后) :cp(向前) 操纵列表 :h grep :查看帮助 ---------------------------------------- " GVIM 的差异比较 gvim -d file1 file2 : vimdiff (比较不差异) dp : 把光标处的不同放到另一个文件 do : 在光标处从另一个文件取得不同 ---------------------------------------- " Vim traps 在正则表达式中 + | ( { 都要加上转义符(反斜杠) /fred\+/ : 匹配 fred/freddy 但不匹配 free /\(fred\)\{2,3}/ : note what you have to break ---------------------------------------- " \v ,或叫做very magic (通常都是这么叫)可以取消转义符 /codes\(\n\|\s\)*where : 普通的正则表达式 /\vcodes(\n|\s)*where : very magic ---------------------------------------- " 把对象送到命令行或者搜索行 <C-R><C-W> : 执行当前光标下的单个单词 <C-R><C-A> : 执行当前光标下尽可能多的单词 <C-R>- : 送至一个小型寄存器(同样使用于插入模式) <C-R>[0-9a-z] : 送至一个命名寄存器 (括弧同上) <C-R>% : 送至文件名(#也行) (同上) <C-R>=somevar : 送至一个变量 (例如 :let sray="ray[0-9]") ---------------------------------------- " 控制寄存器 :let @a=@_ : 清除寄存器 a :let @a="" : 同上 a :let @*=@a : 拷贝寄存器 a 到 paste buffer :let @*=@: : 拷贝最后执行的命令到 paste buffer :let @*=@/ : 拷贝最后执行的查找命令到paste buffer :let @*=@% : 拷贝当前文件到 paste buffer map <f11> "qyy:let @q=@q."zzz" ---------------------------------------- " 帮助的帮助? (使用 TAB) :h quickref : VIM 快速参考页 :h tips : Vim'自己的技巧帮助 :h visual<C-D><tab> : 虚拟模式的帮助列表 : 然后使用tab选择它们 :h ctrl<C-D> : 所有关于ctrl键的帮助列表 :helpg uganda : 过滤帮助文件 使用 :cn, :cp 查找下一个及后一个 :h :r : 关于 :ex 的命令帮助 :h CTRL-R : 普通模式相关 :h /\r : \r是什么的意思 :h \\zs : 使用双反斜线查找关于 \zs 的帮助 :h i_CTRL-R : 在插入模式中 <C-R>的解释 :h c_CTRL-R : 在命令模式中 <C-R> 的解释 :h v_CTRL-V : 虚拟模式 :h tutor : VIM 快速指南 <C-[>, <C-T> : Move back & Forth in HELP History gvim -h : VIM 命令行帮助 ---------------------------------------- " 选项设置在那里 :scriptnames : 列出所有已经加载的 plugins, _vimrcs文件 :verbose set history? :显示 history的值并显示在那里定义的 :function : 列出所有函数 :func SearchCompl : 显示指定函数的细节 ---------------------------------------- " 制作你自己的VIM 帮助 :helptags /vim/vim64/doc : 重新编译所有 *.txt 的帮助文件在这个目录里 :help add-local-help :如何添加本地帮助 ---------------------------------------- " 用外部程序运行文件 (例如 php) map <f9> :w<CR>:!c:/php/php.exe %<CR> map <f2> :w<CR>:!perl -c %<CR> ---------------------------------------- " 在另一个buffer中,捕捉当前脚本的输出 :new | r!perl # : 新建一个buffer,从另一个buffer中读入结果 :new! x.out | r!perl # : 同上,并指定一个新文件名 :new+read!ls ---------------------------------------- " create a new buffer, paste a register "q" into it, then sort new buffer :new +put q|%!sort ---------------------------------------- " 插入DOS换行符 :%s/$/\<C-V><C-M>&/g : (that's what you type :%s/$/\<C-Q><C-M>&/g : for Win32) 对于Win32应该这样 :%s/$/\^M&/g : 你看到的^M是一个字符 ---------------------------------------- " 自动删除行尾 Dos回车符和空格 autocmd BufRead * silent! %s/[\r \t]\+$// autocmd BufEnter *.php :%s/[ \t\r]\+$//e ---------------------------------------- " 对指定文件或文件类型执行某个动作 autocmd VimEnter c:/intranet/note011.txt normal! ggVGg? autocmd FileType *.pl exec('set fileformats=unix') ---------------------------------------- " 把最后一个命令贴到当前位置 i<c-r>: " 把最后一个搜索指令贴到当前位置 i<c-r>/ ---------------------------------------- " 更多的完成功能 <C-X><C-F> :插入当前目录下的一个文件名到当前位置 # 在insert模式下使用 # 然后用 Ctrl-P/Ctrl-N 翻页 ---------------------------------------- " 替换一个visual区域 " 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式 :'<,'>s/Emacs/Vim/g : 前面的' '<.'> 是vim自动添加的 gv : 重新选择前一个可视区域 (ULTRA) ---------------------------------------- " 在文件中插入行号 :g/^/exec "s/^/".strpart(line(".")." ", 0, 4) :%s/^/\=strpart(line(".")." ", 0, 5) :%s/^/\=line('.'). ' ' ---------------------------------------- #用VIM的方式来编号行 :set number : 显示行号 :map <F12> :set number!<CR> : Show linenumbers flip-flop :%s/^/\=strpart(line('.')." ",0,&ts) #从任意行开始编号(需要perl) :'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++' #产生数字列表 #Type in number on line say 223 in an empty file qqmnYP`n^Aq : in recording q repeat with @q " 递增已存在数字到文件末 :.,$g/^\d/exe "normal! \<c-a>" " 高级递增,参见: http://vim.sourceforge.net/tip_view.php?tip_id=150 ---------------------------------------- " 高级递增 (真的很有用) " 把下面几句放到 _vimrc let g:I=0 function! INC(increment) let g:I =g:I + a:increment return g:I endfunction " 例如从mark a 到mark b 递增,从223开始,步长为5 :let I=223 :'a,'bs/^/\=INC(5)/ " create a map for INC cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/ ---------------------------------------- " 生成从 23-64 的数字列表 o23<ESC>qqYp<C-A>q40@q ---------------------------------------- " 在当前插入模式下编辑/移动 (真得很有用) <C-U> : 删除全部 <C-W> : 删除最后一个单词 <HOME><END> : 移动到行首/行尾 <C-LEFTARROW><C-RIGHTARROW> : 向前/后移动一个单词 <C-X><C-E>,<C-X><C-Y> : scroll while staying put in insert ---------------------------------------- #加密(小心使用,不要忘了密码) :X : vim会提示你输入密码 :h :X ---------------------------------------- " 模式行 (使文件只读等),必须在前/后 5行内 // vim:noai:ts=2:sw=4:readonly: " vim:ft=html: : 使用 HTML 语法高亮 :h modeline ---------------------------------------- " 建立你自己的菜单项 amenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR> vim60:fdm=marker<esc>gg ---------------------------------------- " 一个保存当前光标下的狭义字到一个文件的函数 function! SaveWord() normal yiw exe ':!echo '.@0.' >> word.txt' endfunction map ,p :call SaveWord() ---------------------------------------- " 删除重复行的函数 function! Del() if getline(".") == getline(line(".") - 1) norm dd endif endfunction :g/^/ call Del() #使用该函数的一个例子 ---------------------------------------- " 双字节编码 (non alpha-numerics) :digraphs : 显示编码表 :h dig : 帮助 i<C-K>e' : 输入 é i<C-V>233 : 输入 é (Unix) i<C-Q>233 : 输入 é (Win32) ga : 查看字符的hex值 #删除非 ascii 字符 :%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 bar yl/<C-R>" : /[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii ---------------------------------------- " 文件名自动完成 (例如 main_c.c) :e main_<tab> : tab 键完成 gf : 打开光标处广义字命名的文件 (normal模式) main_<C-X><C-F> : 文件名自动完成(insert模式) ---------------------------------------- " Vim复杂使用 " 交换两个单词 :%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g " 交换两个单词 :vnoremap <C-X> <Esc>`.``gvP``P ---------------------------------------- " 把text文件转换成html文件(oh,ft) :runtime! syntax/2html.vim : 转换 txt 成 html :h 2html ---------------------------------------- " VIM 有一个内部自带的 grep 命令 :grep some_keyword *.c : 得到一个包含some_keyword的c文件名列表 :cn : 去下一个出现的位置 ---------------------------------------- " 强制无扩展名的文件的语法着色方式 :set syntax=perl " 取消语法着色 (很有用) :set syntax off " 改变色彩主题 (在~vim/vim??/colors中的任何文件) :colorscheme blue " 通过使用模式行强迫使用 HTML 语法高亮 # vim:ft=html: " 强制自动语法加亮(非标准的文件扩展) au BufRead,BufNewFile */Content.IE?/* setfiletype html ---------------------------------------- :set noma (non modifiable) : 防止修改 :set ro (Read Only) : 只读保护 ---------------------------------------- " 对话 (打开一堆文件) gvim file1.c file2.c lib/lib.h lib/lib2.h : 在"对话"中加载这些文件 :mksession : 生成一个Session文件 (默认是Session.vim) :q gvim -S Session.vim : 重新加载所有文件 ---------------------------------------- #标记(tags) (跳转到子程序/函数) taglist.vim : 很流行的插件 :Tlist : 显示标记 (函数列表) <C-]> : 跳转到光标处的函数 ---------------------------------------- " 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,' endfunction command! -nargs=1 Csv :call CSVH(<args>) " call with :Csv 5 : highlight fifth column ---------------------------------------- " 折叠:隐藏某些片断,使查看更容易 zf} : 使用动作命令折叠一个段落 v}zf : 使用可视模式折叠一个段落 zf'a : 折叠到一个标记上 zo : 打开折叠 zc : 重新关闭折叠 ---------------------------------------- " 显示"不可见字符" :set list :h listchars ---------------------------------------- " 如何在不进入插入模式的情况下粘贴"普通模式的命令" :norm qqy$jq ---------------------------------------- " 处理文件名 :h filename-modifiers : 帮助 :w % : 写入当前文件 :w %:r.cfm : 改变文件扩展名为 .cfm :!echo %:p : 显示完整路径和文件名 :!echo %:p:h : 只显示完整路径 :!echo %:t : 只显示文件名 :reg % : 显示文件名 <C-R>% : 插入文件名 (插入模式) "%p : 插入文件名 (普通模式) /<C-R>% : 在文本中查找文件名 ---------------------------------------- " 删除,但不破坏 buffer 内容 "_d : 你一直想要的东西 "_dw : 例如:删除一个单词 (使用黑洞???) ---------------------------------------- " 送完整的路径名到剪贴板,用于邮件附件等 nnoremap <F2> :let @*=expand("%:p")<cr> :unix nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32 ---------------------------------------- " 不用离开 Vim 就能修改文件名的简单 shell 脚本 $ vim :r! ls *.c :%s/\(.*\).c/mv & \1.bla :w !sh :q! ---------------------------------------- " 在一个文本里计算单词数 g<C-G> ---------------------------------------- " 你自己设置高亮显示的例子 :syn match DoubleSpace " " :hi def DoubleSpace guibg=#e0e0e0 ---------------------------------------- " reproduce previous line word by word imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s " 根据文件类型映射快捷键 :autocmd bufenter *.tex map <F1> :!latex %<CR> :autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR> ---------------------------------------- " 读取 MS-Word 文档,需要 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 >>> ---------------------------------------- " Just Another Vim Hacker JAVH vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?" # 译释:呵呵,谁来解释一下吧! # 其实不过是在启动vim的时候执行了一个命令 # 先写入了 Just Another Vim Hacker 的rot13编码 # 然后再解码