VIM技巧集合

作者: csbde 分类: Linux 发布时间: 2008-03-31 21:29

/joe/e ;: 设置光标到匹配"joe"的末尾 /joe/e+1 ;: 设置光标到匹配"joe"的末尾再后移一位 /joe/s-2 ;: 设置光标到匹配"joe“的开头再前移两位 /joe/+3 ;: 搜索“joe” 找到后将光标下移3行 /^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的行 /\/i ;: 搜索独立的单词fred /\<\d\d\d\d\> ;: 搜索独立的4位数字 /\D\d\d\d\d\D ;: 搜索恰好4位的数字 /\<\d\\> ;: 同/\<\d\d\d\d\> /\([^0-9]\|^\)%.*% ;: 查找以非0~9数字或在行首的%%所包括的内容 ;:" 查找空行 /^\n\ ;: 匹配三连续的空行 ;:" 使用正则表达式组查找 /\(fred\).*\(joe\).*\2.*\1 ;:" 正则表达式重复 /^\([^,]*,\)\ ;:" visual 下搜索 :vmap // y/" ;: visually模式下的键盘映射,把//映射成匹配当前选中的文本 :vmap // y/=escape(@",'\\/.*$^~[]') ;: 包括空白字符 ;:" \zs 和 \ze 匹配原 :h /\zs /<\zs[^>]*\ze> ;: 匹配<与>所包含的内容 ;:" 零宽度匹配 :h /\@= /<\@<=[^>]*>\@= ;: 查找<与>所包含的内容 /<\@<=\_[^>]*>\@= ;: 多行匹配<与>所包含的内容 ;:" 多行查找 \_ 的意思是包括换行符 / ;: 匹配<与>所包含的所有内容 /fred\_s*joe/i ;: 匹配fred开始到joe,之间一定得是空白字符 /bugs\(\_.\)*bunny ;: 匹配所有bugs到bunny的字符串 :h \_ ;: help ;:" 查找函数声明,nmap为normal模式下的键盘映射 :nmap gx yiw/^\(sub\function\)\s\+" ;:" 查找多个文件 :bufdo /searchstr/ ;: 在多个文件缓冲区里执行查找 ;:" 更好的多文件查找定位方法 :bufdo %s/searchstr/&/gic ;: 在多个文件缓冲区里查找,按下n停止 ;:" 怎样不使用 / 来查找网址 ?http://www.vim.org/ ;: 向后查找 ;:" 查找指定字符以外的字符串 /\c\v([^aeiou]&\a) ;: 查找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个空行 :%s/^\n\+/\r/ ;: 压缩空行,多个替换为一个 :%s#<[^>]\+>##g ;: 删除html的tag部分 :%s#<\_.\>##g ;: 多行删除 html 的tags (非贪婪方式) ;:" 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/a/g ;: 将fred替换为寄存器a里的内容 #为按下Ctrl与r :s/fred/asome_texts/g :s/fred/\[email protected]/g ;: 比较好的办法,不显示替换内容 ;:" 在一行里写多种命令 :%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\+\)\\)str1:\1str2: ;:" 交换第一列跟第四列 :%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1: ;:" 过滤form中的内容放在寄存器里 :redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END :nmap ,z :redir @*sil exec '[email protected]<\(input\select\textarea\/\=form\)\>@p'redir END ;:" 两位以上的数字减三(带进位。这个命令挺有趣) :%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 ;:" 将查找内容放入内存,然后用\zs进行简单替换 :%s/"\([^.]\+\).*\zsxx/\1/ ;:" 将xx替换为此行内容 :nmap z :%s#\<=expand("")\># ;:" 将Vis选中的内容用<>括起来 :vmap z :%s/\<*\>/ ;:----------------------------------------------------------------------------- ;:" 下面举一些在替换中使用替换的例子 ;:" 多种分符可以被用在替换中 :%s,\(all/.*\)\@<=/,_,g ;: 用 _ 替换 "all/"之后的 / ;:" 同样的功能 :s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')# :s#all/#&^M#|s#/#_#g|-j! ;" 查找断行,并合并为一行 ;:" 在替换命令中使用替换 :%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/ ;:----------------------------------------------------------------------------- ;:" 全局显示命令 :g/gladiolli/# ;: 查找并显示匹配的行号 :g/fred.*joe.*dick/ ;: 显示所有含有 fred,joe & dick的行 :g/\/ ;: 显示单一单词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 ;: 删除空行 :v/./,/./-j ;: 压缩空行 :g/^$/,/./-j ;: 同上 :g/

: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]*\)\/d ;: 删除最少包含80个tab的行 ;:" 隔行替换 :g/^/ if line('.')%2|s/^/zz / ;:" 查找标记a与b 间所有包含 "somestr" ;:" 复制所有"otherstr"后的行 :'a,'bg/somestr/co/otherstr/ ;: co(py) or mo(ve) :'a,'bg/str1/s/str1/&&&/|mo/str2/ ;" 范围同上,进行替换 :%norm jdd ;: 隔行删除 ;:" 增加数字 (键入 ) ;#在MS-Windows中已经被定义为全选 :.,$g/^\d/exe "norm! \" ;: 增加从当前行首到结尾的数字 :'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 @*[email protected] ;: 放入复制缓冲区 :let @a=''|g/Barratt/y A |:let @*[email protected] :'a,'b g/^Error/ . w >> errors.txt ;" 将查找内容放入一个文件 (文件必须存在) ;:" 复制每一行,然后在复制出来的每一行两侧加上一个 print '复制出来的内容' :g/./yank|put|-1s/'/"/g|s/.*/Print '&'/ ;:" 用文件中的内容替换字符串,-d 表示删除“标记” :g/^MARK$/r tmp.ex | -d ;:" 精致的显示方法 :g/ /z#.5 ;: 带行号显示 :g/ /z#.5|echo "==========" ;: 漂亮的显示 ;:" 用 g// 执行正常命令 :g/|/norm 2f|r* ;: 替换第二个|为* ;:" 在新窗口中显示查找结果 :nmap :redir @a:g//:redir END:new:put! a ;:----------------------------------------------------------------------------- ;:" 全局命令和替换命令联姻 (强大的编辑能力) :'a,'bg/fred/s/joe/susan/gic ;: 可以使用反向引用来匹配 :g/fred/,/joe/s/fred/joe/gic ;: 非行模式 ;:----------------------------------------------------------------------------- ;:" 先找fred,然后找joe :/fred/;/joe/-2,/sid/+3s/sally/alley/gIC ;:----------------------------------------------------------------------------- ;:" create a new file for each line offile eg 1.txt,2.txt,3,txt etc ;:" 将每一行的内容存成一个文件,文件名为 行号.txt 如 1.txt,2.txt 等 :g/^/exe ".w ".line(".").".txt" ;:----------------------------------------------------------------------------- ;:" 绝对精华 ;:----------------------------------------------------------------------------- * # g* g# ;: 查找当前光标下的单词(单个单词) () (向前/向后) % ;: 匹配括号 {}[]() . ;: 重复上次操作 @: ;: 重复上次的命令 matchit.vim ;: 适%能匹配
r]]>

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注