7

我有一个使用内置函数移动光标的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>

但是我不满意,因为:

  1. 它需要在我编写的每个新 fgplugin 上放置烦人的包装器。
  2. 在不离开视觉(当前)模式的情况下调用移动光标(或具有其他任意副作用)的函数似乎是一件很自然的事情。甚至已经<expr>有几乎可以做到的,但它会重置光标位置。
4

1 回答 1

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>
于 2013-04-25T11:21:54.537 回答