在vim中,:make使其易于构建和修复错误,并且:grep:vimgrep的行为类似于:make。但是,为什么需要这两个命令?为什么不只搜索模式并按n?与仅搜索相比,它们的优点是什么?

#1 楼

正如文档所说:

Vim has two ways to find matches for a pattern: Internal and external.


简而言之,:vimgrep使用Vim的grep机制来读取和查找文件。 :grep使用外部命令来完成相同的工作。

/搜索仅针对当前缓冲区,而:[vim]grep搜索整个文件模式,使您可以一次搜索整个项目。 br />
有关更多信息,请查看:h grep

#2 楼

/?仅搜索当前缓冲区,而:grep:vimgrep则将任意文件/模式/全局变量作为参数。

#3 楼

:[vim]grep优于/?的一个好处是,结果被放入快速修复列表(或位置列表(如果使用:l[vim]grep)),这意味着您可以使用:cl拉出所有匹配项的列表。然后,您可以使用数字直接从列表中找到所需的结果。

这也意味着您可以使用与搜索整个代码库:[vim]grep pattern %相同的命令来搜索当前缓冲区:[vim]grep pattern path因此,它具有一些很好的对称性。

此外,您可以扩展并使用Silver Surfer / Ripgrep为您提供非常强大的搜索功能。这些可以映射到:[vim]grep命令。

#4 楼

我看到了3个主要优点


使用一致的regex引擎/语法:使用:grep/vimgrep可以定义grepprg,可以将其定义为grep/ack/ag等。当前缓冲区或多个缓冲区/文件,使用一致的regex引擎。另一方面,如果您使用vim的/pattern选项,则会陷入vim的默认正则表达式引擎中,该引擎的语法与extended regular expression语法不同。因此,无论何时您必须搜索表达式,都必须考虑/记住您应该使用\)还是仅使用)和其他差异。这可能很烦人(https://stackoverflow.com/questions/3864467/whats-the-difference-between-vim-regex-and-normal-regex)

vimgrep会填充一个快速修复程序/位置列表:使用:grep/vimgrep可以填充搜索列表。 (https://medium.com/@lakshmankumar12/quickfix-and-location-list-in-vim-ca0292ac894d)。

如果要使用位置列表,可以使用]q快捷方式如果您有Tim-Popes不受损害的插件(https://github.com/tpope/vim-unimpaired),请浏览它


在vim中进行复杂的搜索:通常,如果您必须这样做复杂的搜索可能需要使用命令行。但是,如果正确定义greprg并使用诸如[1]

:vim / pattern1 / find . -type f

之类的命令,则可以执行非常复杂的搜索并显示搜索结果在您的location listquickfix list中。


[1] http://vimcasts.org/episodes/search-multiple-files-with-vimgrep/