vimscript:在映射中获取可视模式选择文本

时间:2013-07-24 15:38:11

标签: vim

所以我正在尝试在当前选定的文本上运行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"

该问题的评论函数:How to get visually selected text in VimScript

事情是它表现得非常奇怪:大多数时候,函数返回的文本与视觉选择不匹配,而且往往是最后一个视觉选择的文本 - 而不是当前的文本。

在vimscript中获取了大量关于获取视觉选择文本的帖子,但无法使其发挥作用。

我也试过https://stackoverflow.com/a/1534347/287085但没有成功(复制选择注册) - 从我的绑定调用时出错。

1 个答案:

答案 0 :(得分:4)

问题是'<,'>标记在 之后才会设置当前选择(通过在其上执行命令,或通过<Esc>)。在这里,您的表达式映射使得<Esc>前置先保留可视模式变得更加复杂,因此使用:help i_CTRL-R和表达式{{1}插入表达式会更容易}}:

=

如果您不介意破坏默认注册,您也可以选择选择:

:vnoremap <script> <leader>* <Esc>:lvimgrep /<C-R><C-R>=<SID>get_visual_selection()<CR>/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen