将通过命令获得的一组文件加载到Vim缓冲区
我通常执行将通过命令获得的一组文件加载到Vim缓冲区,vim,Vim,我通常执行查找-type f | xargs grep'something'并尝试在Vim中打开这些文件。现在发生的是,我必须关闭和打开Vim会话,有时,如果我丢失了结果,我必须再次执行查找操作。有没有一种方法可以在Vim中实现自动化,比如我希望Vim将所有这些文件打开到单独的缓冲区中,以便我可以在它们之间无缝切换?注意,我正在查看是否可以从Vim中执行这些find命令(使用!),然后将这些文件作为缓冲区加载 如果您遇到上述情况,您还会使用其他技巧吗?Vim有几个集成和实现Grep功能的命令(请
查找-type f | xargs grep'something'
并尝试在Vim中打开这些文件。现在发生的是,我必须关闭和打开Vim会话,有时,如果我丢失了结果,我必须再次执行查找操作。有没有一种方法可以在Vim中实现自动化,比如我希望Vim将所有这些文件打开到单独的缓冲区中,以便我可以在它们之间无缝切换?注意,我正在查看是否可以从Vim中执行这些find命令(使用!
),然后将这些文件作为缓冲区加载
如果您遇到上述情况,您还会使用其他技巧吗?Vim有几个集成和实现Grep功能的命令(请参阅
:帮助grep
)。两个主要的是:grep
和:vimgrep
。前者
使用外部Grep程序(由grepprg
选项设置),而后者使用
Vim本身实现的核心Grep功能
内部:vimgrep
的主要优点是Vim regex语法和
可移植性,包括**
全局通配符。:vimgrep
命令
了解扩展全局模式的子集(请参见:help wildcard
)。这
允许在大多数情况下避免使用find
命令。使用:vimgrep
,您的
示例搜索如下所示
:vimgrep /something/ **/*
如果您的shell或
grepprg
实现了**
通配符。下面是一个显示Zsh的示例
扩展全局表示法
:grep 'something' **/*(.)
这两个命令(及其变体)都利用Vim接口特性
调用QuickFix列表及其窗口本地版本、位置列表(请参见:帮助
快速修复
)。QuickFix窗口是一个特殊的只读缓冲区,其中包含
一种与一个或多个文件相关的搜索结果。搜索结果
由Grep命令收集的数据将立即聚合到QuickFix窗口中
快速修复列表通过以下方式表示搜索模式的每个匹配位置:
一条线,并允许通过按在它们之间快速切换
在这些行中输入。有不少命令与
快速修复列表。这里我只列出其中的一些作为起点(请参阅帮助)
更多信息)
或:cw
打开快速修复窗口(请参阅帮助以了解 它们之间的区别):cope
,:cc
,:cn
显示当前、下一个和上一个 分别在列表中进行匹配:cp
,:cr
显示列表中的第一个匹配项和最后一个匹配项, 分别:cla
关闭快速修复窗口:ccl
或:lw
打开与当前 窗户:lop
,:ll
,:lne
显示当前、下一个和上一个 分别在列表中进行匹配:lp
,:lr
显示列表中的第一个匹配项和最后一个匹配项, 分别:lla
关闭位置列表:lcl
:grep
和:vimgrep
命令的位置列表对应项是:lgrep
和
:lvimgrep
,分别。如果你想打开一个由外部程序生成的文件列表,你可以通过另一个步骤轻松完成:查找-type f | xargs grep-l'something'| xargs vim
它将把每个文件作为一个单独的缓冲区加载。你将如何逐个导航文件?感谢详细的响应。非常感谢!我在谷歌上搜索了一下手册,但这些并不能导致这个结果。谢谢。@Senthil:大多数情况下,您可能会发现自己使用:cn
、:cp
命令或快速修复列表本身在匹配之间导航。@Senthil:快速修复列表和位置列表非常有用。我建议浏览与这些(:help quickfix.txt
)相关的整个帮助文件,并使用:n
和:n
在匹配的文件之间切换。但要在文件中匹配模式的特定位置之间跳转,您必须一次又一次地搜索它。