vim内置搜索命令vimgrep, 可以实现跨文件查找关键字。相当于IDE里的在指定目录下进行关键字搜索功能。

vimgrep命令:

:vim[grep] /pattern/[g][j] files ...
g和j参数都是可选的,:vimgrep命令可以缩写为:vim
g :
不加该选项时,当一行中有多个匹配项时,仅在 quickfix 中添加一行。添加该选项时,每个匹配都在quickfix 列表中添加一项。所以一般不用加/g参数;
j :
不加该选项,查找完毕,光标将跳转到第一个匹配处。添加该选项时,查找完毕,仅更新 quickfix 列表,光标不跳转。所以一般都会加上/j参数;
files :
% 表示在当前文件中查找。
*.cpp 表示在当前目录中的 .cpp 文件中搜索。
**/*.cpp 表示在当前目录及子目录中 .cpp 文件中搜索。
**/*.cpp **/*.h 表示在当前目录及子目录中 .cpp、.h 文件中搜索。
当前目录 用 :pwd 命令查看当前目录。用 :cd path切换当前目录为path。
文件可以为多个,中间空格隔开
vimgrep帮助信息::help :vimgrep
注意:
:cd .. 将当前目录切换到当前所在的上级目录
:cd %:h 将当前目录变成当前文件所在的目录
:cdcd ~ 将当前目录更改为您的主目录
:cd - 将当前目录更改为您访问的上一个目录
使用netrw文件浏览器时也可以通过按c键来设置当前目录

一些使用案例:

在当前目录下(不包括子目录)的所有php文件里搜索"keyword", 且不自动跳转到搜索结果:
vimgrep /keyword/j *.php

在当前目录及其子目录下的所有php文件里递归搜索"keyword",且不自动跳转到搜索结果:
vimgrep /keyword/j **/*.php
注意:**表示在当前目录以及子目录递归, 比如**/*.php

在当时目录及其子目录下递归搜索"keyword"
vimgrep /keyword/j **

如果要搜索多个文件扩展名, 用空格分开即可: vimgrep /字符串/j **/*.cpp **/*.php

使用绝对路径, 递归搜索:
vimgrep /字符串/j /home/user/**/*.cpp
vimgrep /字符串/j D:\home\user/**/*.cpp

vim除了使用vimgrep命令进行文本搜索,还可以使用grep命令进行文本搜索。
vimgrep命令使用vim内置的搜索引擎,而grep命令调用外部grep工具实现文本搜索,所以相对速度更快。
grep命令会运行由选项grepprg所指定的程序。在Linux系统上,grepprg默认是grep -n,在Windows系统上,grepprg默认是findstr /n
由此可见,使用vimgrep命令在不同平台上将获得一致的体验。而grep命令则是与操作系统相关的,在不同平台会有不同的行为。所以vimgrep命令兼容性更强。

grep命令

在当前目录下查找所有文件:
:grep block *.*
默认情况下,grep是区分大小写的,可以使用-i选项来忽略大小写:
:grep -i word filename

使用-o选项,将只显示匹配的字符,而不是整行内容:
:grep -o [[:punct:]] filename
grep帮助信息::help :grep
请注意,递归搜索子目录的**/*.*通配符,对于Linux下的:vimgrep和:grep命令有效;但对于Windows下的:grep命令不起作用。

'grepprg’选项

使用以下命令,可以查看’grepprg’选项的当前设置:
:set grepprg?
在不同的操作系统下,Vim将默认使用不同的外部grep工具:
在Windows下
grepprg=findstr /n
在Linux下
grepprg=grep -n $* /dev/null
如果希望默认查询当前目录以及其子目录,那么可以使用以下设置:
在Windows下
set grepprg=findstr /S /n
在Linux下
set grepprg=grep -nR $* /dev/null
请注意,您可以使用:pwd命令来查看当前目录。
如果您在Windows中已经安装了Git或Cygwin,那么只需要在环境变量PATH中增加相应目录,即可调用其自带的grep命令:
C:\Program Files\Git\usr\bin
D:\cygwin64\bin
在Windows命令行中,可以使用以下命令进行验证:$ grep --version
然后在vimrc配置文件中,使用以下设置:
set grepprg=grep\ -rnIH\ --exclude-dir=.git
通过以上设置,可以在Windows环境中使用Linux风格的grep程序。

QuickFix列表窗口

:cw 打开 quickfix 列表窗口,也可用:copen
:ccl 关闭 quickfix 列表窗口,是:cclose的缩写
:cn, :cp:cnext, :cprev的缩写,跳转到quickfix 列表的下 / 上一个匹配处
:cfirst, :clast 跳转到 quickfix 列表的第一项、最后项的匹配处。
每次跳转需要输入命令太麻烦了,可以设置快捷键映射一下:
用 F11 及 Shift-F11 在 quickfix 列表中向后、向前跳转。

:nnoremap <F11>  :cnext<CR>
:nnoremap <S-F11>  :cprev<CR>

lvim[grep] 与 vim[grep] 的区别

lvim 使用窗口的本地列表,vim 使用 quickfix 列表。
lvim 的窗口本地列表跳转命令为::lnext 、 :lprev 、 :lfirst 及 :llast 。
命令除了首字母不同,其余是一样的。(一个是l,一个是c)

:grep:vimgrep命令,都将在QuickFix中显示搜索结果。
:lgrep:lvimgrep命令实现相同的功能,但使用地址列表(Location List)来显示匹配结果。

使用:copen:cw命令打开的Quickfix,是全局性的。而使用:lopen打开的Location List,则是独立存在于各个窗口中的。

对于Quickfix,使用:cp命令,跳转到上一个匹配处;使用:cn命令,跳转到下一个匹配处。

对于Location List,使用:lpre命令,跳转到上一个匹配处;使用:lnext命令,跳转到下一个匹配处。

参考/转载:

  • https://zhuanlan.zhihu.com/p/148280898
  • https://fengliurenwu.blog.csdn.net/article/details/76193550?spm=1001.2101.3001.6650.2&utm_medium=distribute.wap_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-2.wap_blog_relevant_default&depth_1-utm_source=distribute.wap_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-2.wap_blog_relevant_default
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐