函数在 vimscript 中被多次调用
Function is called several times in vimscript
我想在可视模式下当用户按下qq
时调用一个函数,所以我写了下面的代码:
function! FindSelectionMeaning()
echo "FindSelectionMeaning"
endfunction
vnoremap <silent> qq :call FindSelectionMeaning()<CR>
函数已调用,但我有以下问题:
- 为什么
FindSelectionMeaning
会为每个选定的行调用一次?我认为它应该只被调用一次
- 有什么方法可以通过
vnoremap
调用与脚本相关的函数(在本例中是 s:FindSelectionMeaning
而不是 FindSelectionMeaning
)?
你的命令被调用了几次(实际上是选中的行数),因为,当你在可视模式下按:
时,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选择了文本。
我想在可视模式下当用户按下qq
时调用一个函数,所以我写了下面的代码:
function! FindSelectionMeaning()
echo "FindSelectionMeaning"
endfunction
vnoremap <silent> qq :call FindSelectionMeaning()<CR>
函数已调用,但我有以下问题:
- 为什么
FindSelectionMeaning
会为每个选定的行调用一次?我认为它应该只被调用一次 - 有什么方法可以通过
vnoremap
调用与脚本相关的函数(在本例中是s:FindSelectionMeaning
而不是FindSelectionMeaning
)?
你的命令被调用了几次(实际上是选中的行数),因为,当你在可视模式下按:
时,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选择了文本。