Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3354284
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: LINUX

2011-12-09 13:54:21

转自:

本文所說的文件內容搜索,指的是在多個文件中搜索特定的內容,並列出所有的查詢結果。

Vim支持两种文件內容搜索,分别是:vimgrep:grep,前者是内部搜索,后者是外部搜索。

所谓内部搜索,是Vim内建的文件內容搜索功能,它的原理为将所有要搜索的文件逐个打开,然后像使用/键搜索那样搜索这些文件的内容。它的优点是不需要任何设置即可在任何Vim支持的平台上运行,同时可以使用功能比较强大的Vim正则表达式,另外,对于非英文字符,只要Vim可以正确识别的,:vimgrep都可以正常搜索。这种搜索方式的缺点也很明显,由于是模拟逐个打开文件并搜索,因此它的速度一般比较慢,对于像我这样动辄在包含有几百个文件的项目中搜索的情况,用:vimgrep是一种煎熬。

vimgrep的命令格式为:

:vim[grep][!] /{pattern}/[g][j] {file}

最基本的用例:

:vim /function demo/ *.php

即在当前目录下所有的php文件中搜索"function demo",若希望在递归搜索当前目录及其所有任何深度的子目录中的php文件,格式为:

:vim /function demo/ **/*.php

如果要同时在js文件中搜索,格式有两种:

:vim /function demo/ **/*.{php,js}
:vim /function demo/ **/*.php **/*.js

默认情况下,vim会在当前窗口中打开所有搜索结果中的第一个,如果不希望这样,办法有两种:

:vim! /function demo/ **/*.{php,js}
:vim /function demo/j **/*.{php,js}

另外,缺省情况下,vimgrep搜索时是否区分大小写受vim选项ignorecase控制,可以在搜索表达式中使用\c表示忽略大小写,或者使用\C表示区分大小写:

:vim /\cfunction demo/ **/*.{php,js}
:vim /\Cfunction demo/ **/*.{php,js}

j外,还有一个选项g。缺省情况下,即使一行中多次出现了搜索表达式所匹配的内容,vim也会将其按一个搜索结果返回;加上g选项后,vim会将这样的行当多个搜索结果返回。

至于外部搜索方式,是vim调用外部的搜索工具进行文件內容搜索并获取其搜索结果。这种搜索方式的优点是给予用户最大的方便,以允许使用各自熟悉的 搜索工具完成工作。虽然其功能和速度取决于所调用的外部搜索工具,但一般来说使用外部搜索工具会比vimgrep速度快很多。其缺点是需要配置才能使用, 并且不同的系统环境下所使用的外部搜索工具以及功能会有不同。

以linux下为例,要使用外部搜索,先设定外部搜索所使用的工具,以及一些缺省选项:

:set grepprg=grep\ -nri\ --include=*.{php,js}

这表示vim的内部搜索命令:grep将使用外部搜索工具grep进行搜索,注意这里两个grep表示不同的含义,前者表示vim的内部搜索命令,后者是一个独立的文件搜索程序。同时为grep程序指定了一些它自己的选项作为缺省值,-n表示在搜索结果中显示该行所在文件中的行号,-r表示递归搜索指定目录下所有任意深度的子目录中的文件,-i表示忽略大小写,当然,忽略大小写会使搜索速度慢很多。另外,使用–include注意:include前有两个“-”,不知道为什么,wordpress将它们过滤成了一个)选项指定只搜索特定后缀名的文件。

:grep命令的格式为:

:gr[ep][!] {arguments}

:vimgrep一样,!仍然用来表示不自动在当前窗口打开第一个搜索结果。arguments因使用的外部搜索工具而异,对于上面设定的grep,基本格式为:

:gr! function\ demo .

结合:set grepprg中的设定,它表示在当前目录下所有子目录中后缀为php和js的文件中搜索function demo,且忽略大小写并不自动在当前窗口打开第一个搜索结果。

无论是:vimgrep还是:grep,其搜索结果都会显示在vim的quickfix列表窗口中,使用:copen:cclose打开和关闭此窗口。另外还有一对对应的命令,:lvimgrep:lgrep,它们与各自对应的命令不同的地方在于,其搜索结果会显示在vim的location列表窗口中,location窗口是当前窗口的内嵌窗口,而不是像quickfix列表窗口那样是vim的全局窗口,平等于其它窗口显示在vim的上方或者下方。使用命令:lopen:lclose打开和关闭location窗口。

:vimgrep:grep有一些使用技巧:

前面说过用!防止vim自动在当前窗口中打开第一个搜索结果,如果希望在新窗口中打开第一个搜索结果,方法是:

:split|gr function\ demo .

即使用管道。

还有,在quickfix窗口打开的前提下,使用:colder:cnewer可以前后查看此前做过的搜索的结果,从而无须重新进行搜索。

另外,对于:vimgrep,由于是模拟逐个打开文件再做搜索从而导致速度变慢,使用:noautocmd命令在某些情况下可以对:vimgrep起到加速作用。

番外篇

某天,有个哥们儿很纳闷儿地问我究竟vim比eclipse好在哪里。

又某天,有个姐们儿很奇怪为什么公司其它人的编辑器都是白底儿(ultraedit或eclipse),而我的却是黑底儿的。

又又某天,又有个姐们儿在我:vimgrep的时候嫌速度不如她的ultraedit快,我一向不是个布道者,但却是个卫道者,速度嘛,看完:grep再说话!

阅读(3367) | 评论(0) | 转发(1) |
0

上一篇:vim 中的 arg 命令

下一篇:vim 字统计

给主人留下些什么吧!~~