所以我试图有一个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"
Run Code Online (Sandbox Code Playgroud)
该函数来自对问题的评论:How to get visual selected text in VimScript
事情是它的行为非常奇怪:大多数情况下,函数返回的文本与视觉选择不匹配,而且通常是最后一个视觉选择的文本 - 而不是当前的。
已经阅读了大量关于在 vimscript 中获取视觉选择文本的帖子,但无法使其正常工作。
我也试过/sf/answers/107404321/没有成功(将选择复制到注册) - 从我的绑定调用时出错。
问题是,直到当前选择被保留之后(通过在其上执行命令,或通过),'<,'>
标记才会被设置。在这里,表达式映射使得在前面添加 an 来首先离开视觉模式变得更加复杂,因此使用表达式寄存器插入表达式会更容易:<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
Run Code Online (Sandbox Code Playgroud)
如果您不介意破坏默认寄存器,您也可以直接取消选择:
:vnoremap <leader>* y:lvimgrep /<C-R><C-R>"/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen
Run Code Online (Sandbox Code Playgroud)