我有一个使用内置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>
几乎可以做到,但它会重置光标位置。答案 0 :(得分:2)
我通过将mode
参数(或者一个布尔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>