Vim:如何打开Grep匹配行中的文件?

16

在命令行中使用grep后,我想自动跳转到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))

3
:grep 和快速修复缓冲区(:copen)有什么问题? - Benjamin Bannier
谢谢@BenjaminBannier,你如何在git grep中使用:copen命令? - Paul Rougieux
@PaulRougieux 一般来说,可以参考 https://dev59.com/EGMl5IYBdhLWcg3wzpnV,但对于 git grep,我个人会选择 https://github.com/tpope/vim-fugitive/blob/master/doc/fugitive.txt#L91(即使对于其他 shell 命令,我也可能会使用 https://github.com/tpope/vim-dispatch)。 - Benjamin Bannier
8个回答

29

如果你将来自 grep 的输出导入到 vim

% grep -n checkWordInFile * | vim -

你可以将光标放在文件名上,然后按下 gF 键,跳转到grep输出所引用的文件中的该行代码。使用 ^WF 可以在新窗口中打开它。

在vim中,您也可以使用相同的方法进行操作。

:tabedit
:r !grep -n checkWordInFile *

这与其等效但不如其方便

:lgrep checkWordInFile *
:lopen

使用这个命令可以打开超级方便的quickfix窗口,可以方便地浏览搜索结果。

您也可以通过使用 Vim 的原生 grep 命令来获得更慢但在某些方面更灵活的结果:

:lvimgrep checkWordInFile *
:lopen

这个使用vim的正则表达式和路径(例如允许 ** )。它可能需要2-4倍的时间来运行(甚至更长),但你可以使用花哨的 \(\)\@<= 和类似的东西。


使用 :lopen 替代 :lgrep,使用 :copen 替代 :grep。 - hhh
lgrep 为当前标签页创建一个单独的列表。否则,如果您从不同的标签页执行 :grep,那么会覆盖同一个全局列表。至少我是这样认为的;我通常使用 lvimgrepr !grep...,只是出于完整性的考虑添加了 :lgrep。我想 *open 实际上并不在问题的范围内,那只是我通常的做法。 - intuited
实际上,这是针对当前窗口而不是标签页的。 - intuited
呃呃呃呃呃,太不可思议了! - ThePosey
1
把光标放在文件名上,然后按下 gF 键 --> 对我不起作用。有什么配置可以启用这个功能吗? 我使用这些命令没有看到结果。这需要特定的 vim 版本吗?我正在使用 VIM8。 - mtk
显示剩余2条评论

9

5
你可以这样做:
% vim "+/checkWordInFile" $(grep -l checkWordInFile *)

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

更正:

+ / ...选项只会在第一个文件中搜索正则表达式。要在每个文件中进行搜索,您需要使用以下内容:

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

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

5

我想这就是你要找的内容:

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

当你打开一个文件行时,例如从编译器的错误信息(或grep输出)中复制和粘贴时,vim会尝试打开一个带有冒号名称的文件。使用此小脚本放置在插件文件夹中,如果冒号后面的内容是一个数字,并且在冒号前指定的文件名存在,则vim将打开此文件并将您带到您想要的那一行。这绝对是我正在寻找的东西。

2

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

1
如果您使用git,那么仅在git跟踪的文件中搜索通常会更有意义。要在vim中打开给定行处的文件(该行是git grep的搜索结果),您需要fugitive插件
:copen
:Ggrep pattern

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


-3
在这个特定的例子中:
vim SearchToUser.java +170

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