在vimscript中多次调用函数

时间:2016-04-04 15:08:32

标签: vim vim-plugin

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

function! FindSelectionMeaning()
  echo "FindSelectionMeaning"
endfunction

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

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

  • 为什么FindSelectionMeaning会为每个选定的行调用一次?我认为应该只调用一次
  • 有没有办法通过vnoremap调用与脚本相关的功能(在这种情况下是s:FindSelectionMeaning而不是FindSelectionMeaning)?

1 个答案:

答案 0 :(得分:2)

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

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

此函数返回所选文本。