如何在不离开可视模式的情况下调用移动光标的函数?

时间:2013-04-25 10:50:34

标签: vim

我有一个使用内置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>几乎可以做到,但它会重置光标位置。

1 个答案:

答案 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>