我想在用户在可视模式下按qq
时调用一个函数,所以我编写了以下代码:
function! FindSelectionMeaning()
echo "FindSelectionMeaning"
endfunction
vnoremap <silent> qq :call FindSelectionMeaning()<CR>
调用该函数但我有以下问题:
FindSelectionMeaning
会为每个选定的行调用一次?我认为应该只调用一次vnoremap
调用与脚本相关的功能(在这种情况下是s:FindSelectionMeaning
而不是FindSelectionMeaning
)?答案 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
此函数返回所选文本。