vimscript 中函数被多次调用

Fro*_*art 2 vim vim-plugin

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

function! FindSelectionMeaning()
  echo "FindSelectionMeaning"
endfunction

vnoremap <silent> qq :call FindSelectionMeaning()<CR>
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么FindSelectionMeaning每个选定的线路都会被调用一次?我认为它应该只被调用一次
  • 有没有办法通过vnoremap(在本例中s:FindSelectionMeaning而不是FindSelectionMeaning)调用脚本相关的函数?

Ken*_*ent 5

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

vnoremap <silent> qq :<c-u>call FindSelectionMeaning()<CR>
Run Code Online (Sandbox Code Playgroud)

<c-u>在之后删除范围信息:

事实上,你可以通过这种方式获取选定的文本,我认为它更容易,保留映射<c-u>,并更改你的功能:

function! FindSelectionMeaning ()
  try
    let v_save = @v
    normal! gv"vy
    return @v
  finally
    let @v = v_save
  endtry
endfunction
Run Code Online (Sandbox Code Playgroud)

该函数返回选定的文本。