因此,我试图lvimgrep
在当前选定的文本上运行绑定。
fun! s:get_visual_selection()
let l=getline("'<")
let [line1,col1] = getpos("'<")[1:2]
let [line2,col2] = getpos("'>")[1:2]
return l[col1 - 1: col2 - 1]
endfun
vnoremap <expr> <script><leader>* ":lvimgrep /" . <SID>get_visual_selection() . "/j **/*." . expand("%:e") . " \|lopen"
该函数来自对以下问题的评论:如何在VimScript中获得可视选择的文本
问题在于它的行为确实很奇怪:大多数情况下,该函数返回的文本与视觉选择不匹配,而且通常是最后一个视觉选择的文本,而不是当前的视觉选择。
在vimscript中获取视觉选择文本时,已经经历了无数篇文章,但是却无法使其正常工作。
我还尝试了https://stackoverflow.com/a/1534347/287085,但没有成功(将选择复制到注册中)-从绑定中调用时出现错误。
问题在于,'<,'>
直到留下当前选择之后(通过在其上执行命令或通过<Esc>
),才设置标记。在这里,您的表达式映射使先添加一个<Esc>
离开可视模式变得更加复杂,因此使用:help i_CTRL-R
和表达式寄存器插入表达式更加容易=
:
:vnoremap <script> <leader>* <Esc>:lvimgrep /<C-R><C-R>=<SID>get_visual_selection()<CR>/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen
如果你不介意重挫默认的寄存器,你也可以只抽出的选择:
:vnoremap <leader>* y:lvimgrep /<C-R><C-R>"/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句