Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1378308
  • 博文数量: 704
  • 博客积分: 10140
  • 博客等级: 上将
  • 技术积分: 6230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 20:41
文章分类

全部博文(704)

文章存档

2013年(1)

2012年(16)

2011年(536)

2010年(151)

分类: C/C++

2011-01-16 18:41:51


[翻译]
"visual searching
" 可视模式下的查找
:vmap // y/"       : search for visually highlighted text
                                     查找被高亮显示的文本
:vmap //    y/=escape(@", '\\/.*$^~[]') : with spec chars
                                                               高亮文本包含特殊字符
[注解]
                                                                                                    :help v
这两个键映射用于在可视模式下查找被高亮显示的文本,如果高亮文本中包含特殊字符,需要使用第两种格式的键映射。
(使用二者任一)映射后,当你使用v或V选中一段文本后,再按“//”就可以查找这段文本。
以第二个映射为例进行讲解:
                                                                                                    :help vmap
vmap                            定义一个virsual的键映射
                                                                                                    :help map-
                       执行此映射时不回显
                                                                                                    :help y
y                               拷贝选中的内容到无名寄存器
/                               开始搜索
                                                                                                    :help c_CTRL-R_=
=                          搜索的内容来源于一个表达式的结果
                                                                                                    :help escape()
escape()                        把参数1中所包含的特殊字符(由参数2指定)前加转义符\
                                                                                                    :help registers
                                                                                                    :help expr-register
@"                              代表无名寄存器中的内容
'\\/.*$^~[]'                    对这些特殊字符进行转义
                                                                                                    :help key-notation
                           回车

翻译]
" \zs and \ze regex delimiters :h /\zs
" \zs和\ze正则表达式符号,:h /\zs
/<\zs[^>]*\ze>              : search for tag contents, ignoring chevrons
                              查找XML标记的内容,忽略尖括号
[注解]
                                                                                                    :help /\zs
                                                                                                    :help /\ze
这个正则表达式匹配位于“<>”间的内容,但不匹配“<”和“>”这两个字符。
其中,“\zs”指明匹配在此处开始,“\ze”指明匹配在此处结束。
 
[翻译]
" zero-width :h /\@=
"零长度 :h /\@=
/<\@<=[^>]*>\@=             : search for tag contents, ignoring chevrons
                              查找XML标记的内容,忽略尖括号
/<\@<=\_[^>]*>\@=           : search for tags across possible multiple lines
                              查找可能越过多行的XML标记
[注解]
                                                                                                    :help \@<=
                                                                                                    :help \@=
这两个正则表达式理解起来有难度,要讲清楚也不容易。
像“\@<=”、“\@=”、“\<”、“\>”、“\zs”、“\ze”这类的元字符,并不匹配任何实际字符,它们只是用来检查匹配是否存在。正则表达式在进行匹配时,需要满足它们所规定的条件。因为它们不匹配实际字符,所以称它们为匹配零长度的元字符。
“\<”和“\>”匹配单词的开始和结束。
“\zs”和“\ze”表示匹配的开始和结束。
“\@<=”要求前面的元字符刚好出现在它后面的匹配模式之前。它只是用来检查这个条件,它前面的元字符并不会包含在匹配结果中。
“\@=”匹配它前面的元字符,但匹配长度为0。也就是说,它只检查前面的元字符是否存在,并不把前面的元字符包含在匹配结果中。在它后面出现的元字符,将在与它前面的元字符相同的位置被匹配。举个例子,“foo\(bar\)\@=”匹配foolbar单词中的foo,但不会匹配fool。而“foo\(bar\)\@=foo”不匹配任何东西,因为它要求在foobar的b字母开始的位置上匹配foo,这显然是不可能的。“foo\(bar\)\@=…”会匹配到foobar而不会匹配foobbb,想一想为什么?
对于正则式“<\@<=[^>]*>\@=”来说,“\@<=”的作用是要求“<”必须出现在“[^>]*”模式之前,但匹配是从“[^>]*”开始的;而“\@=”表示必须有“>”出现,但并不把“>”包含在匹配结果中(零长度匹配)。所以这个表达式的效果和上面的“<\zs[^>]*\ze>”是相同的。
                                                                                                    :help /\_[]
“\_[]”匹配集合中的元字符和换行符。我们在前面介绍过“\_.”和“\_s”,它们都是在原有的匹配上增加了换行符。这是VIM正则表达式的扩展。
 
[翻译]
"searching over multiple lines \_ means including newline
" 查找多行。\_ 表示包括新行
/                : search for multiple line comments
                                     查找多行注释
[注解]
                                                                                                    :help \p
                                                                                                    :help \_p
                                                                                                    :help /\{-
这个正则表达式查找跨行的XML注释。
其中“\p”代表可显示字符,“\_p”在“\p”基础增加了换行符的匹配。
“\{-}”匹配前面的元字符,尽可能少。它和“*”的区别是,“*”会尽可能多的匹配它前面的元字符。
 
[翻译]
/fred\_s*joe/i                    : any whitespace including newline
                                     查找在 fred 和 joe 两个单词之间任意多的空格,包括新行
[注解]
见前。
 
[翻译]
/bugs\(\_.\)*bunny                : bugs followed by bunny anywhere in file
                                     bugs 后任意位置含有 bunny 单词的多个行
[注解]
见前。
 
[翻译]
:h \_                             : help
                                     帮助
[注解]
                                                                                                    :help \_
帮助入口。
 
[翻译]
" search for declaration of subroutine/function under cursor
" 查找光标下子程序/函数的声明
:nmap gx yiw/^\(sub\function\)\s\+"
[注解]
                                                                                                    :help :nmap
                                                                                                    :help iw
                                                                                                    :help
这个映射中的大部分内容在前面都介绍过。它的思路是先把光标下的单词拷贝到无名寄存器,然后在这个单词前加上sub前缀或function前缀进行查找。
nmap用来建立一个normal下的键映射。
iw则用来选择一个单词。其它的文本对象,可以通过“:help object-select”查询。
用来代表“|”字符,在map命令中经常会用到这种表示方法,详情参阅“:help <>”。
理解了这个键映射的原理后,你可以按自己的需要对其进行修改。
 
[翻译]
" multiple file search
" 多文件查找
:bufdo /searchstr/                : use :rewind to recommence search
                                   使用:rewind重新开始搜索
[注解]
                                                                                                    :help :bufdo
                                                                                                    :help :rewind
这个命令在缓冲区列表中的每个缓冲里执行查找。
:rewind命令会跳到参数列表的第一个文件。所谓参数列表,是指你在启动VIM时给出的多个文件名,详见“:help argument-list”。
 
[翻译]
" multiple file search better but cheating
" 更好的多文件查找技巧
:bufdo %s/searchstr/&/gic   : say n and then a to stop
                                    输入n然后输入a以停止查找
[注解]
                                                                                                    :help :s
                                                                                                    :help s/\&
                                                                                                    :help :s_flags
这个命令颇具技巧,它实际上是用替换命令实现在多个缓冲区中查找。它用起来比上面的tip友好多了。
输入这条命令后,会挨个遍历每个符合项,需要结束查找时,按a。这个命令虽然查找起来方便,但一旦按a中途退出,就会进行替换,导致文件的改变标记被置位(文件实际内容并没发生变化,因为在替换时使用的是原内容)。
在后面的替换一节会详细介绍:s命令。
 
 [翻译]
" How to search for a URL without backslashing
" 如何不使用反斜线查找 URL
?        : (first) search BACKWARDS!!! clever huh!
                             首先向上查找!!!聪明啊!!!
[注解]
                                                                                                    :help ?
在查找目录、或网站链接之类的字符串时,因为这些内容中含有“/”,如果用“/”命令查找,则需要对里面的“/”进行转义,很麻烦。
如果用“?”查找就可以绕开转义符,多省事!
如果要查找类似“c:\a\b\c\d\e”的字符串,这样做也许会简单些:/=escape('c:\a\b\c\d\e', '\')
上面的是需要按CTRL-R输入的。
 
[翻译]
" Specify what you are NOT searching for (vowels)
" 指定不要查找什么
/\c\v([^aeiou]&\a){4}       : search for 4 consecutive consonants
                             查找4个连续的辅音字母
[注解]
                                                                                                    :help /\c
                                                                                                    :help /\v
                                                                                                    :help /\a
这个正则式用来查找4个连续的辅音字母。
它运用了两个修辞用的元字符,“\c”表示对其后面的内容忽略大小写,“\v”表示会将其后的内容中所有 '0'-'9','a'-'z','A'-'Z' 和 '_' 之外的字符都当特殊元字符对待,也就是说,“(”相当于“\(”,“&”相当于“\&”,“{”相当于“\{”;这样可以减少转义字符“\”的数目,输入起来方便多了。如果在“\v”后确实要用这些字符的本义,就需要在字符加转义字符“\”,以得到本义。
 
[翻译]
/\%>20l\%<30lgoat           : Search for goat between lines 20 and 30 *N*
                             在第20行到第30行间查找goat
[注解]
                                                                                                    :help /\%l
这个正则式在指定的行范围内查找。
“\%>20l”表示大于20行,“\%<30l”表示小于30行。
 
[翻译]
/^.\{-}home.\{-}\zshome/e   : match only the 2nd occurence in a line of "home" *N*
                             只匹配一行中第二次出现的"home"
[注解]
这个正则式只匹配行中第二次出现的“home”,这个正则式中用到的元字符在前面都介绍过。
 
阅读(448) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-08 12:49:31

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com