2

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

:vimgrep mywords %

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

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

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

好吧,它对我不起作用,当我将焦点放在一个单词上并选择它时,我按 F8,vim 没有响应。如何实现?

谢谢!

4

2 回答 2

3

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正如@ryuichiro 的回答所概述的那样,最简单的是ank:

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

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

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

强大的插件解决方案

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

于 2016-11-29T14:52:33.637 回答
1

尝试

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

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

于 2016-11-29T14:16:51.947 回答