vim内置的搜索命令vimgrep使用-程序员宅基地

技术标签: 编辑器  linux  vim  

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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiangkejkl/article/details/121422352

智能推荐

已知num为无符号十进制整数,请写一非递归算法,该算法输出num对应的r进制的各位数字。要求算法中用到的栈采用线性链表存储结构(1<r<10)。-程序员宅基地

文章浏览阅读74次。思路:num%r得到末位r进制数,num/r得到num去掉末位r进制数后的数字。得到的末位r进制数采用头插法插入链表中,更新num的值,循环计算,直到num为0,最后输出链表。//重置,s指针与头指针指向同一处。//更新num的值,至num为0退出循环。//末位r进制数存入s数据域中。//头插法插入链表中(无头结点)//定义头指针为空,s指针。= NULL) //s不为空,输出链表,栈先入后出。

开始报名!CW32开发者扶持计划正式进行,将助力中国的大学教育及人才培养_cw32开发者扶持计划申请-程序员宅基地

文章浏览阅读176次。武汉芯源半导体积极参与推动中国的大学教育改革以及注重电子行业的人才培养,建立以企业为主体、市场为导向、产学研深度融合的技术创新体系。2023年3月,武汉芯源半导体开发者扶持计划正式开始进行,以打造更为丰富的CW32生态社区。_cw32开发者扶持计划申请

希捷硬盘开机不识别,进入系统后自动扫描硬件以识别显示_st2000dm001不认盘-程序员宅基地

文章浏览阅读5.7k次。2014年底买的一块2TB希捷机械硬盘ST2000DM001-1ER164,用了两年更换了主板、CPU等,后来出现开机不识别的情况,具体表现为:关机后开机,找不到硬盘,就进入BIOS了,只要在BIOS状态下待机半分钟左右再重启,硬盘就会出现。进入系统后,重启(这个过程中主板对硬盘始终处于供电状态),也不会出现不识别硬盘的现象。就好像是硬盘或主板上某个电容坏了一样,刚开始给硬盘通电的N秒钟内电容未能..._st2000dm001不认盘

ADO.NET包含主要对象以及其作用-程序员宅基地

文章浏览阅读1.5k次。ADO.NET的数据源不单单是DB,也可以是XML、ExcelADO.NET连接数据源有两种交互模式:连接模式和断开模式两个对应的组件:数据提供程序(数据提供者)&DataSetSqlConnectionStringBuilder——连接字符串Connection对象用于开启程序和数据库之间的连接public SqlConnection c..._列举ado.net在操作数据库时,常用的对象及作用

Android 自定义对话框不能铺满全屏_android dialog宽度不铺满-程序员宅基地

文章浏览阅读113次。【代码】Android 自定义对话框不能铺满全屏。_android dialog宽度不铺满

Redis的主从集群与哨兵模式_redis的主从和哨兵集群-程序员宅基地

文章浏览阅读331次。Redis的主从集群与哨兵模式Redis的主从模式全量同步增量同步Redis主从同步策略流程redis主从部署环境哨兵模式原理哨兵模式概述哨兵模式的作用哨兵模式项目部署Redis的主从模式1、Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。2、为了分担读压力,Redis支持主从复制,保证主数据库的数据内容和从数据库的内容完全一致。3、Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。全量同步Redis全量复制一般发_redis的主从和哨兵集群

随便推点

mysql utf-8的作用_为什么不建议在MySQL中使用UTF-8-程序员宅基地

文章浏览阅读116次。作者:brightwang原文:https://www.jianshu.com/p/ab9aa8d4df7d最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:Incorrect string value: ‘😃 我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“????..._mysql utf8的作用

MATLAB中对多张图片进行对比画图操作(包括RGB直方图、高斯+USM锐化后的图、HSV空间分量图及均衡化后的图)_matlab图像比较-程序员宅基地

文章浏览阅读278次。毕业这么久了,最近闲来准备把毕设过程中的代码整理公开一下,所有代码其实都是网上找的,但都是经过调试能跑通的,希望对需要的人有用。PS:里边很多注释不讲什么意思了,能看懂的自然能看懂。_matlab图像比较

16.libgdx根据配置文件生成布局(未完)-程序员宅基地

文章浏览阅读73次。思路:  screen分为普通和复杂两种,普通的功能大部分是页面跳转以及简单的crud数据,复杂的单独弄出来  跳转普通的screen,直接根据配置文件调整设置<layouts> <loyout screenId="0" bg="bg_start" name="start" defaultWinId="" bgm="" remark=""> ..._libgdx ui 布局

playwright-python 处理Text input、Checkboxs 和 radio buttons(三)_playwright checkbox-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏13次。playwright-python 处理Text input和Checkboxs 和 radio buttonsText input输入框输入元素,直接用fill方法即可,支持 ,,[contenteditable] 和<label>这些标签,如下代码:page.fill('#name', 'Peter');# 日期输入page.fill('#date', '2020-02-02')# 时间输入page.fill('#time', '13-15')# 本地日期时间输入p_playwright checkbox

windows10使用Cygwin64安装PHP Swoole扩展_win10 php 安装swoole-程序员宅基地

文章浏览阅读596次,点赞5次,收藏6次。这是我看到最最详细的安装说明文章了,必须要给赞!学习了,也配置了,成功的一批!真不知道还有什么可补充的了,在此做个推广,喜欢的小伙伴,走起!_win10 php 安装swoole

angular2里引入flexible.js(rem的布局)_angular 使用rem-程序员宅基地

文章浏览阅读1k次。今天想实现页面的自适应,本来用的是栅格,但效果不理想,就想起了rem布局。以前使用rem布局,都是在原生html里,还没在框架里使用过,百度没百度出来,就自己琢磨,不知道方法规范不规范,反正成功了,操作如下:1、下载flexible.js2、引入到angular项目里3、根据自己的需要修改细节3.1、在flexible.js里修改每份的像素,3.2、引入cssrem插件,在设置里设..._angular 使用rem

推荐文章

热门文章

相关标签