ChrisHartjes今天正在寻找Vim的“在项目中查找”功能。“在项目中查找”是Textmate的一个功能,他已经习惯了这个功能,但在寻找与之对应的功能时遇到了困难。
有趣的是,Textmate是一个新来者,当然,vim多年来一直有这样的功能。当然,使用vim时要记住的是它的unix根;通常,如果您知道用于执行某些操作的unix命令,则可以在vim中找到您需要的命令。在这种情况下,关键是vimgrep插件,它随标准vim发行版一起提供。
vimgrep上有各种资源。vim文档中包含一个章节,在google上快速搜索该主题会立即找到一些不错的教程。如果您曾经使用过grep,语法会非常简单:
vimgrep /{pattern}/[g][j] {file} ...
“g”选项表示将返回搜索的所有匹配项,而不是每行一个,“j”选项告诉vim不自动跳转到第一个匹配项。不过,“g”标志的真正含义是什么,以及如何返回搜索结果?
Vimgrep在所谓的“quickfix”窗口中返回搜索结果,这就是vimgrep文档分崩离析的地方……它没有解释这是什么,也没有链接到它(这很好地表明它实际上有一个单独的主题)。
Quickfix窗口是一个窗格,每行显示一个搜索结果。每行显示匹配的文件、行号和该行的内容:
/home/matthew/git/bugapp/application/controllers/helpers/GetForm.php|10| * @var Zend_Loader_PluginLoader
你不能从这个窗口做很多事情;它只是作为您当前正在从列表中查看的文件的视觉指示器。但是,在主窗口中,您可以开始使用Quickfix命令的子集,一次一个地迭代结果。快速总结:
- :cc将移动到列表中的下一个匹配项
- :cn将移动到列表中的下一个匹配项
- :cp将移动到列表中的上一个匹配项
- :cr将倒退到列表中的第一个匹配项
- :cla将快进到列表中的最后一场比赛
完成后,您只需关闭Quickfix窗口/窗格即可继续工作。
我应该注意到vimgrep是跨平台的。在基于*nix的系统上,它默认使用本机grep命令,但它还包含一个内部(较慢的)实现,用于默认不提供grep的操作系统。如果需要,您还可以将命令映射到替代实现。
我个人在项目插件中使用此功能最多。项目将vimgrep映射到两个不同的命令:g
和G
。第一个将grep当前项目中当前级别的所有文件;thesecond做同样的事情,但也递归到子项目中。这是重构代码的一种非常简单的方法,特别是对于名称更改。