vim内置搜索命令vimgrep, 可以实现跨文件查找关键字。相当于IDE里的在指定目录下进行关键字搜索功能。
: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
将当前目录变成当前文件所在的目录
:cd
或 cd ~
将当前目录更改为您的主目录
: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 block *.*
默认情况下,grep是区分大小写的,可以使用-i选项来忽略大小写:
:grep -i word filename
使用-o选项,将只显示匹配的字符,而不是整行内容:
:grep -o [[:punct:]] filename
grep帮助信息::help :grep
请注意,递归搜索子目录的**/*.*
通配符,对于Linux下的:vimgrep和:grep命令有效;但对于Windows下的:grep命令不起作用。
使用以下命令,可以查看’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程序。
: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 使用窗口的本地列表,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命令,跳转到下一个匹配处。
参考/转载: