在Vim中如何搜索所有源代码?

43

当使用Vim时,如果给定一个填充有代码的目录(例如~/trunk/),其中包含多个子目录,是否有一种方法可以在整个源代码中grep/search文本/正则表达式实例?

目前我使用:

:lcd ~/trunk
:grep "pattern" *.py */*.py */*/*.py */*/*/*.py

(显然,我只限制在Python文件中搜索,这是另一个问题,但值得注意的是,理想情况下,我希望将搜索限制在特定扩展名的文件中。)

8个回答

44

vimgrep。我没有投入时间来使它变得有用。 - Brian M. Hunt
这是“正确的方法”,因为这是“vim方式”。 - David Rivers
vimgrep 仅打开一个文件并显示匹配项,而不是显示具有“可点击”匹配行的缓冲区。此外,它不支持递归。它毫无用处,我不知道为什么有人会更喜欢它而不是在命令行中使用普通的 grep,即使需要手动复制和打开其结果。 - Hi-Angel

7
我直接使用grep来实现这个功能。
grep -IirlZ "pattern" .|xargs -0 vim

-I: ignore binary
-i: ignore case
-r: recursive
-l: print file name only
-Z: print \0 after each file name

6
你可能想查看vim文档中的:vimgrep:grep:vimgrep使用vim自己的模式搜索功能,并将所有文件读入vim缓冲区。默认情况下,:grep链接到系统上的外部grep实用程序,但您可以通过设置grepprg选项来更改其行为。这是在线文档的链接:

http://vimdoc.sourceforge.net/htmldoc/quickfix.html#grep

在Vim技巧Wiki中的“在文件中查找Vim”提示中,有更多相关信息和其他选项:

http://vim.wikia.com/wiki/Find_in_files_within_Vim


4

grepprg 设置为 Ack,然后使用 :grep 命令进行 Ack 搜索。

或者使用 ctags。


Universal ctags确实很酷,但有时您只想通过文本模式进行grep搜索,而不是专门搜索声明/实现。Ack的链接已损坏。 - Hi-Angel
我修复了链接。顺便说一句,Ack 真是太棒了,它完美地将 grep 与 vim 集成在一起:即具有通常的 grep 功能 + 结果会在单独的缓冲区中打开,并且可以“点击”。 - Hi-Angel

3

如果它是git仓库的一部分,那么git grep也是一个不错的选择。 - Tmx

2
您可以使用 :vimgrep,如下所示:
  :vimgrep /pattern/ **/*.py
请参考 Vim 提示: 此外,请查看 grep.vim,它是一个插件,将 grep、fgrep、egrep 和 agrep 工具与 Vim 整合在一起,允许您在一个或多个文件中搜索模式并跳转到它们...

1

你可以使用ctags生成源代码索引,然后VIM可以使用此功能无缝浏览你的代码库。它是源代码感知的,因此你可以直接跳转到方法声明等。

你需要定期重新生成ctags文件,但可以将其作为make过程的一部分来完成。除非你的代码库很大,否则速度应该相当快。


这如何帮助找到符号引用? - Mykola Golubyev
ctags会索引您的源代码(大多数语言)。VIM具有通过ctags索引导航的功能,因此您可以将光标定位在任何符号上,然后直接跳转到定义处。我想是Ctrl + ]。 - Brian Agnew

0

没有人提到它,但我现在倾向于使用ripgrep


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接