Vim:在Grep给出的行上打开匹配的文件?

时间:2010-04-16 13:55:48

标签: vim grep

我希望在命令行上进行grepping后自动获取Vim中结果的位置。有这样的功能吗?

要在Vim上打开的文件,请参阅grep:

% grep --colour -n checkWordInFile *
SearchToUser.java:170:  public boolean checkWordInFile(String word, File file) {
SearchToUser.java~:17:  public boolean checkWordInFile(String word, File file) {
SearchToUser.java~:41:          if(checkWordInFile(word, f))

8 个答案:

答案 0 :(得分:26)

如果您将grep的输出传输到vim

% grep -n checkWordInFile * | vim -

你可以将光标放在文件名上并点击gF跳转到该文件中由该行grep输出引用的行。 ^WF会在新窗口中打开它。

从vim中你可以用

做同样的事情
:tabedit
:r !grep -n checkWordInFile *

相当于

但不太方便
:lgrep checkWordInFile *
:lopen

它会显示超级快速修复窗口,以便您方便地浏览搜索结果。

通过使用vim的本机grep,您可以选择速度更慢,但在某种程度上更灵活的结果:

:lvimgrep checkWordInFile *
:lopen

这个使用vim RE和路径(例如允许**)。跑步可能需要2-4倍(可能更多),但你可以使用花哨的\(\)\@<=和羽毛。

答案 1 :(得分:7)

查看“Grep search tools integration with Vim”和“Find in files within Vim”。基本上,vim提供了搜索文件的这些命令:

:grep
:lgrep
:vimgrep
:lvimgrep

这些文章提供了有关其用法的更多信息。

答案 2 :(得分:5)

你可以这样做:

% vim "+/checkWordInFile" $(grep -l checkWordInFile *)

这将在vim命令行中放入与正则表达式匹配的所有文件的列表。 “+ / ...”选项将告诉vim从每个文件的开头搜索,直到找到与正则表达式匹配的第一行。

<强>校正:

+ / ...选项仅搜索正则表达式的第一个文件。要搜索您需要的每个文件:

% vim "-c bufdo /checkWordInFile" $(grep -l checkWordInFile *)

如果这是你经常需要做的事情,你可以写一个bash函数,这样你只需要指定一次正则表达式(假设正则表达式对grep和vim都有效)。

答案 3 :(得分:4)

我认为这就是你要找的东西:

http://www.vim.org/scripts/script.php?script_id=2184

  

当你打开一个文件:line时,例如当从编译器(或grep输出)中复制和粘贴时,vim会尝试打开名称中带冒号的文件。如果冒号之后的东西是一个数字,并且存在一个文件存在,并且冒号之前有一个文件存在,冒号将打开这个文件并带你到你想要的第一行。

这绝对是我想要的。

答案 4 :(得分:2)

我强烈推荐ack.vim over grep来实现此功能。

http://github.com/mileszs/ack.vim

http://betterthangrep.com/

答案 5 :(得分:2)

您可能想要为这些功能创建功能。 :)

顺序vim电话(控制台)

grep -rn "implements" app | # Or any (with "-n") you like
  awk '{
    split($0,a,":"); # split on ":"
    print "</dev/tty vim", a[1], "+" a[2] # results in lines with "</dev/tty vim <foundfile> +<linenumber>
  }' |
  parallel --halt-on-error 1 -j1 --tty bash -ec # halt on error and "-e" important to make it possible to quit in the middle

使用:cq中的vim停止编辑。

标签中的同时打开(gvim

启动服务器:

gvim --servername GVIM

打开标签:

grep -rn "implements" app | # again, any grep you like (with "-n")
  awk "{ # double quotes because of $PWD
    split(\$0,a,\":\"); # split on ":"
    print \":tabedit $PWD/\" a[1] \"<CR>\" a[2] \"G\" # Vim commands. Open file, then jump to line
  }" | 
  parallel gvim --servername GVIM --remote-send # of course the servername needs to match

答案 6 :(得分:1)

如果使用git,则仅在git跟踪的文件中搜索时,结果通常更有意义。要在给定的行中打开文件,这是git grep在vim中的搜索结果,您需要先fugitive plugin,然后

:copen
:Ggrep pattern

将为您提供缓冲区中的列表,您可以从git grep结果中选择打开文件。

答案 7 :(得分:-2)

在这个特定的例子中:

vim SearchToUser.java +170