我有一个使用内置 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>
但是我并不满意,因为:
<expr>
几乎可以做到,但它会重置光标位置。 最佳答案
我通过传递 mode
来解决这个问题参数(或 bool 值 isVisual
标志)到函数中:
fu! F(mode) range
if a:mode ==# 'v'
normal! gv
endif
...
endf
nn <buffer> a :cal F('n')<cr>
vn <buffer> a :cal F('v')<cr>
关于vim - 如何在不离开可视模式的情况下调用移动光标的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16212801/