有没有办法配置Vim grepprg选项,以避免等到外部工具完成搜索?

时间:2011-02-01 16:42:59

标签: vim grep

我很长一段时间是Vimmer。但是,我一直切换到shell进行搜索。这避免了我使用quickfix功能。

切换到shell的主要原因是当我在Vim内部使用grep(使用:grep)时,我无法跟进进度。

因为我搜索的代码库通常很宽,所以我非常感谢您的反馈。

它让我有机会在显示完整结果之前发现我的搜索表达式错误。

这允许我取消搜索,优化表达式,然后重新启动搜索。

任何提示如何在Vim内重现这种模式都将不胜感激。

5 个答案:

答案 0 :(得分:1)

您是否熟悉ack.vim?它不使用quickfix窗口,但在拆分中使用单独的缓冲区。然而,它更快的结果回到了vim框架。

答案 1 :(得分:1)

我没有看到与你相同的vim行为。当我运行:grep时,我仍然会在搜索完成之前在vim中查看结果(不在quickfix中)(但在搜索完成之前我无法执行任何操作)。

我甚至尝试过不使用vim设置或插件:

gvim -u NONE -U NONE

如果那不是您的行为,请检查您的grepprg。我的默认是:

:verbose set grepprg
grepprg=grep -n $* /dev/null

当我使用run grep -e "score" -R /etc时,我在vim中看到了这个输出:

:!grep -n -e "score" -R /etc /dev/null 2>&1| tee /tmp/voLcaNS/232

您的系统可能缺少tee或者您的vim不使用它(我在Ubuntu 10.10上使用的是Vim 7.2)。 tee获取传递给它的文本并将其写入文件和stdout。


如果您正在寻找一种方法让quickfix更新您的搜索结果并让您在搜索时不阻止vim,那么您可以编写一个脚本:

  • 使用grep作为后台进程进行搜索并重定向到文件
  • 每秒直到grep完成,让vim加载quickfix(cgetfile)中的文件(你可以告诉vim用--remote-expr从另一个进程做一些事情)

您可以尝试我的AsyncCommand plugin来启动您的代码。它执行上述操作,但它仅在搜索完成时加载文件。

答案 2 :(得分:0)

在在线文档中查看:vimgrep。它显示正在搜索的文件名并随时更新。

答案 3 :(得分:0)

这可能是由于greptee之间的缓冲,而不是vim本身。要测试此理论,请从命令行运行grep并通过tee管道输出(即grep <pattern> <files> | tee temp.out)。如果它与你在vim中观察到的行为相同,那么就会发生缓冲。

要解决此问题,请在Ubuntu 10.10上安装expect(sudo apt-get install expect-dev),并将grepprg安装到unbuffer grep -n $* /dev/null。 (见Turn off buffering in pipe)。

答案 4 :(得分:0)

有三种方法可以在整个项目中进行搜索。

  • 系统命令grep(快速,但与Ouickfix列表不兼容)

    =>$ grep -n Example *
    
  • Vim内部grep(缓慢,但有强大的模式支持)

    :vim[grep] /{pattern}/[g][j] {file} ...
    
  • 系统插件确认(完美)

    1安装确认

    brew install ack
    

    2将以下配置添加到.vimrc

    :set grepprg=ack\ --nongroup\ --column\ $*
    
    :set grepformat=%f:%l:%c:%m
    

    3然后您可以使用grep在vim中调用ack,如

    :grep "object\." app/**/*.rb