我有一个使用内置函数移动光标的cursor()
函数,它在正常模式下工作正常。
具体来说,假设这是函数:
function! F()
call cursor( line('.')+1, 1)
endfunction
与映射一起使用:
nnoremap <buffer> a :call F()<cr>
现在我想重用这个函数在任何视觉模式(视觉、线条视觉和块视觉)上移动光标,而不会丢失之前的选择。
例如,在视觉模式下使用初始缓冲区(c
表示光标位于一行,v
表示该行是当前视觉选择的一部分):
vc 1
2
3
击中a
会给出:
v 1
vc 2
3
再次击中a
会给出:
v 1
v 2
vc 3
所以保留了旧的选择。
我想F()
尽可能多地重用,因为在我的应用程序F()
中非常大。
最好的方法是什么?
到目前为止,我能做的最好的就是使用包装函数:
function! VisMove(f)
normal! gv
call function(a:f)()
endfunction
并映射为:
vnoremap <buffer> a :call VisMove('F')<cr>
但是我不满意,因为:
- 它需要在我编写的每个新 fgplugin 上放置烦人的包装器。
- 在不离开视觉(当前)模式的情况下调用移动光标(或具有其他任意副作用)的函数似乎是一件很自然的事情。甚至已经
<expr>
有几乎可以做到的,但它会重置光标位置。