在 Vim 中使用
:vimgrep
,在正常模式下我可以输入:
:vimgrep mywords %
在当前目录下的文档中搜索“mywords”。
但我希望在正常模式下,当我使用
gd
突出显示单词时,或者在视觉模式下使用viw
选择单词时,我使用热键F8来执行vimgrep。所以我添加了我的 vimrc
并重新启动 Vim:
vnoremap <F8> :vimgrep expand('<cword>') %<CR>
这对我不起作用。我将焦点放在一个单词上并选择它,按 F8,Vim 中没有任何反应。我怎样才能让它发挥作用?
谢谢!
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>
映射。