如何使用 vimgrep 来 grep 被 vim 高亮显示的工作?

How to use vimgrep to grep work that's high-lighted by vim?

我安装了 vimgrep 插件,在 vim 里面,在正常模式下我可以输入:

:vimgrep mywords %

搜索"mywords"当前目录下的文件。

但我希望在正常模式下,当我使用 gd 突出显示一个词时,或者在可视模式下使用 'viw' 到 select 一个词时,我使用热键 vimgrep。所以我添加了我的 .vimrc 并重新启动 vim:

vnoremap <F8> :vimgrep expand('<cword>') %<CR>

嗯,这对我不起作用,当我将焦点放在一个词上 select 它时,我按 F8,vim 没有反应。如何实现?

谢谢!

尝试

vnoremap <F8> y:vimgrep "<c-r>"" %<CR> 

推荐阅读:Mapping keys in Vim - Tutorial (Part 1)

Vimscript 的计算方式与在 : 命令行中键入的 Ex 命令完全相同。 ex 中没有变量,因此无法指定它们。交互式输入命令时,您可能会使用 <C-R>= 来插入变量内容:

:vimgrep <C-R>=expand('<cword>')<CR> '%'<CR>

... 但在脚本中,必须使用 :execute。 Ex命令的所有文字部分都必须用引号引起来(单引号或双引号),然后与变量连接:

execute 'vimgrep' expand('<cword>') '%'

实际上,有一个用于将当前单词插入命令行的内置命令::help c_CTRL-R_CTRL-W:

:vimgrep <C-R><C-W>

你的映射

您可以使用所有三种方法;让我们使用最后一个:

vnoremap <F8> :<C-u>vimgrep <C-r><C-w> %<CR>

<C-u>清除自动插入的'<,'>范围

您可能想要什么

在视觉模式下使用当前单词很奇怪。您可能想要搜索当前选择。没有 expand() 。最简单的是 yank,如 @ryuichiro 的回答所述:

vnoremap <F8> y:vimgrep /<C-r>"/ %<CR>

仍然缺少转义文字文本(:vimgrep 搜索正则表达式模式)和 / 分隔符:

vnoremap <F8> y:execute 'vimgrep /\V' . escape(@@, '/\') . '/ %'<CR>

强大的插件解决方案

现在,如果您还想避免破坏默认寄存器,事情会变得非常复杂。看看我的GrepHere plugin;它为此提供了 {Visual}<A-M> 映射。