5

所以我试图有一个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没有成功(将选择复制到注册) - 从我的绑定调用时出错。

4

1 回答 1

4

问题是直到当前选择离开之后(通过对其执行命令或通过)'<,'>才设置标记。在这里,您的表达式映射使得在前面添加 an 以首先离开视觉模式变得更加复杂,因此使用和表达式 register插入表达式更容易:<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
于 2013-07-24T15:53:46.607 回答