VIM:如何在特定的文件列表或目录列表中进行grep(即不递归),并在quickfix窗口中显示结果?

VIM:如何在特定的文件列表或目录列表中进行grep(即不递归),并在quickfix窗口中显示结果?,vim,vim-plugin,Vim,Vim Plugin,我处理多个相当大的项目,每个项目有1600多个文件,跨越125多个目录,但这些文件中散布着大量文件和目录的大型项目,这使得从项目顶部进行递归搜索变得太慢和笨拙。我不想抢先将所有这些文件加载到vim的缓冲区中 幸运的是,这些项目有相当好的文件列表,我可以解析这些文件列表来设置特定于项目的vimrc文件(project.vimrc),这些文件现在只包含很多“set path+=/path/to/dir”,这对于让“gf”这样的东西快速工作非常有用 我想找到一个grep解决方案,在给定的文件列表或vi

我处理多个相当大的项目,每个项目有1600多个文件,跨越125多个目录,但这些文件中散布着大量文件和目录的大型项目,这使得从项目顶部进行递归搜索变得太慢和笨拙。我不想抢先将所有这些文件加载到vim的缓冲区中

幸运的是,这些项目有相当好的文件列表,我可以解析这些文件列表来设置特定于项目的vimrc文件(project.vimrc),这些文件现在只包含很多“set path+=/path/to/dir”,这对于让“gf”这样的东西快速工作非常有用

我想找到一个grep解决方案,在给定的文件列表或vim的path变量的目录中搜索字符串,并在quickfix窗口中列出结果。有办法做到这一点吗


大多数现有的grep解决方案似乎希望您指定顶级目录并递归,或者让您grep浏览已加载到缓冲区的文件。

如果您的
'path'
选项已经包含一个感兴趣的目录列表,您可以将其传递到
:vimgrep
,如下所示:

:execute 'vimgrep /pattern/' join(map(split(&path, ','), 'v:val . "/*"'))

这会将
/*
附加到每个路径,以便搜索该目录中的任何文件。

grep
可以像通过
grep-r foo/bar/
那样递归搜索多个目录(有关详细信息,请参见
man grep
:h:grep
)。然而,grep在处理很多文件时可能会有点慢。有一些不错的选择:

  • 比常规grep更快,因为它跳过VCS目录、二进制文件,并且可以搜索特定类型的文件类型,如
    --perl
    。有关Vim集成,请参阅
  • 是一种类似于ack的代码搜索工具,但速度更快。Vim插件:
  • git grep
    快速搜索存储库。提供
    :Ggrep
我推荐Ag和git-grep,因为它们都非常快。我在不到1秒的时间内搜索了4700多个

要在没有插件的情况下测试这些备选方案中的一个,或者您根本不需要插件,您可以相应地设置
'grepprg'
选项。e、 g.
设置grepprg=ack
。有关更多信息,请参见
:h'grepprg'

如果确实需要搜索特定的文件列表,则Ack具有
--files from=FILE
-x
选项,分别以文件或stdin的形式获取文件列表

对某些编程语言可能有帮助的其他工具有:

  • 构建符号数据库并允许您跳转到符号。请参见
    :h标记和搜索
  • 是一种类似ctags的工具,但可以将其视为类固醇ctags,因为 比ctags提供的功能要多得多
  • locate
    unix工具与find非常相似,只是它使用预构建的数据库。参见
    人员定位
    和Tim Pope's
  • 是另一个提供ctag/cscope类选项的符号数据库
作为最后的后备方案,您可以使用
:vimgrep
,因为它在所有Vim可用的系统上都可用。有关更多帮助,请参见
:h:vimg

由于大多数选项都使用快速修复列表,我建议您使用一些更友好的映射来横穿快速修复列表。我使用Tim Pope的插件,它分别使用
]q
[q
作为
:cnext
:cprev
。有些人喜欢在执行搜索后打开quickfix,然后将以下内容添加到
~/.vimrc
文件中:
autocmd QuickFixCmdPost*grep*cwindow


总而言之,你有很多选择,但我个人怀疑你能否在一般搜索需求方面击败git grep或Ag In。我也使用GNU Global来满足我的符号需求。

你考虑过git grep或git grep吗?这些通常都比grep快得多。所有这些包括普通grep和
:vimgrep
都需要额外的时间目录参数。我已经查看了这些参数,但它们似乎希望您指定一个从中递归下来的顶级目录,或者将所有文件加载到vim缓冲区中。但是,很可能我遗漏了一些内容。我有一个包含4700多个文件的repo,git grep和ag返回结果不到一秒钟。Ack支持
--files from=FILE
和d
-x
它从文件或stdin中获取要搜索的文件。我建议您不要立即忽略这一点。不过,您可能还希望查看CTAG、cscope或global。就是这样。我错过了--file from=file选项,因为我只查看了ack.vim的文档。这正是我要查找的,它的工作方式与ch.vim类似arm!!你想把你的评论移到一个答案上,这样我就可以正式接受它了吗?这正是我想要的。
grep-I
跳过二进制文件;
grep--include=
用于文件名/扩展名过滤;
grep--exclude dir={.git,.svn}
跳过VCS(例如);