[翻译]
"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”,这个正则式中用到的元字符在前面都介绍过。
阅读(479) | 评论(1) | 转发(0) |