如何在vim中检索当前搜索的文本?

4
例如,我有一些代码并使用“*”在该代码中搜索某些内容。在该文件中未找到所需内容后,我想使用类似于ackgrep的工具在本地目录中搜索。我知道可以使用:! ack whatever在vim内进行搜索,但我想知道是否有一种方法可以在vim中用当前搜索的单词替换whatever
4个回答

4
您可以使用Ctrl-r加/来插入上次搜索的寄存器。
:!grep <Ctrl-r> / file_list

请查看 Vim Tips Wiki 条目获取更多信息。
更新: * 搜索命令始终包括单词边界。
但是,g* 搜索命令的行为与 * 相同,但不包括单词边界。
这可以用来解决问题,而不是使用rampion的解答中的自定义宏

这个可以工作,但是当与 * 结合使用时,它也具有单词边界。有没有办法去掉它们? - Paul Wicks
*搜索设置了搜索模式,以包括单词边界。因此,您不能使用*来获取不带单词边界的模式。 - Tim Henigan
@Paul Wicks:请查看我的更新,关于 g* 搜索命令的内容。 - Tim Henigan

1
Tim Henigan的回答的基础上,将以下内容添加到你的 .vimrc 文件中。
cmap <C-R>/ <C-R>=substitute(substitute(@/, '^\\<', '', ''), '\\>$', '', '')

现在,在命令行模式下按下CTRL-R /时,它将删除单词边界标记,因此您应该能够使用以下命令:
:!grep CTRL-R / file-list

太棒了,这正是我在寻找的。我稍微修改了你的映射,以避免需要按两次回车键:cmap <C-R>/ <C-R>=substitute(substitute(@/, '^\\<', '', ''), '\\>$', '', '') <CR> - Paul Wicks
另一个选项是使用g*搜索命令而不是*。有关详细信息,请参阅我的更新答案:https://dev59.com/KE3Sa4cB1Zd3GeqPvn9f#2739223 - Tim Henigan
按下 ctrl-r 后跟着 /,会插入搜索寄存器中的文本,但如果你按下 ctrl-r 后跟着键盘上的任何字母,它将插入相应寄存器的内容。除了字母外,还有其他特殊寄存器,例如 .(最后输入的文本)、%(当前文件名)等。通过重新映射 ctrl-r,您将无法使用这些各种寄存器构建的潜在有用快捷方式。 - nelstrom
1
@nelstrom:我不是重新映射 CTRL-R,我正在重新映射 CTRL-R /。所有其他的 CTRL-R 命令仍然有效。 - rampion

1

我还没有找到一种简单的方法来将搜索寄存器的内容传递给外部程序,而不需要使用键映射和eval语句。

但是,您可以使用<cword>将当前光标下的单词传递给外部程序:

:!echo <cword>

或者

:!ack <cword>

我确实执行了这个命令(:! echo @/),但是echo的输出文字确实字面上的'@/'。 - Tim Henigan
有没有办法获取文本,而不带有单词边界? - Paul Wicks
@Tim Henigan,我的错误,:echo @/ 将会显示 / 寄存器的内容... - John Weldon

0

您可以将单词移动到寄存器中,然后在命令模式行中使用@regnum。

"1yw :!grep @1


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