如何使用 vimgrep 来 grep Vim 高亮的单词?

问题描述 投票:0回答:2

在 Vim 中使用

:vimgrep
,在正常模式下我可以输入:

:vimgrep mywords %

在当前目录下的文档中搜索“mywords”。

但我希望在正常模式下,当我使用

gd
突出显示单词时,或者在视觉模式下使用
viw
选择单词时,我使用热键F8来执行vimgrep。所以我添加了我的
vimrc
并重新启动 Vim:

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

这对我不起作用。我将焦点放在一个单词上并选择它,按 F8,Vim 中没有任何反应。我怎样才能让它发挥作用?

谢谢!

select vim highlight vimgrep
2个回答
6
投票

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()
。最简单的是
y
ank,如 @ryuichiro 的回答所述:

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

仍然缺少文字文本的转义(

:vimgrep
搜索正则表达式模式)和
/
分隔符:

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

强大的插件解决方案

现在,如果您还想避免破坏默认寄存器,那么事情就会变得非常复杂。看看我的 GrepHere 插件;它为此提供了一个

{Visual}<A-M>
映射。


1
投票

尝试

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

推荐阅读:Vim 中的映射键 - 教程(第 1 部分)

© www.soinside.com 2019 - 2024. All rights reserved.