将通过命令获得的一组文件加载到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
    关闭快速修复窗口
位置列表是附加到特定窗口的快速修复列表。每个窗口 可以附加一个位置列表(独立于其他位置) windows的位置列表和快速修复列表)。任何快速修复列表命令 上面列出的那些人中,有一个相当于使用位置列表的人

  • :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
在匹配的文件之间切换。但要在文件中匹配模式的特定位置之间跳转,您必须一次又一次地搜索它。