我已经在vim内部安装了vimgrep插件,在正常模式下我可以输入:
:vimgrep mywords %
在“mywords”中搜索当前目录下的文档。
但我希望在正常模式下,当我使用gd突出显示单词时,或者在可视模式下使用'viw'来选择单词时,我会使用热键来进行vimgrep。所以我添加了我的.vimrc并重新启动vim:
vnoremap <F8> :vimgrep expand('<cword>') %<CR>
好吧,它对我不起作用,当我把焦点放在一个单词并选择它时,我按F8,在vim中没有响应。如何实现呢?
谢谢!
答案 0 :(得分:2)
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 plugin;它提供了{Visual}<A-M>
映射。
答案 1 :(得分:1)
尝试
vnoremap <F8> y:vimgrep "<c-r>"" %<CR>