函数在 vimscript 中被多次调用

Function is called several times in vimscript

我想在可视模式下当用户按下qq时调用一个函数,所以我写了下面的代码:

function! FindSelectionMeaning()
  echo "FindSelectionMeaning"
endfunction

vnoremap <silent> qq :call FindSelectionMeaning()<CR>

函数已调用,但我有以下问题:

你的命令被调用了几次(实际上是选中的行数),因为,当你在可视模式下按:时,vim会自动添加范围'<,'>,它导致为每个选定的行执行稍后输入的命令。如果您的函数只想调用一次,您可以像这样更改映射:

vnoremap <silent> qq :<c-u>call FindSelectionMeaning()<CR>

<c-u> 将删除 :

之后的范围信息

其实你可以通过这种方式获取选中的文本,我觉得更简单,保持<c-u>映射,改变你的函数:

function! FindSelectionMeaning ()
  try
    let v_save = @v
    normal! gv"vy
    return @v
  finally
    let @v = v_save
  endtry
endfunction

这个函数returns选择了文本。