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

标签 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>

但是我并不满意,因为:
  • 它需要在我编写的每个新 fgplugin 上放置烦人的包装器。
  • 在不离开视觉(当前)模式的情况下调用一个移动光标(或具有其他任意副作用)的函数似乎是一件很自然的事情。甚至已经有<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/

    相关文章:

    vim - 是否有从当前行跳转第 N 行的命令?

    vim - 一些 vim 航空公司主题不起作用

    regex - 使用 vim 将缩进目录列表转换为完整路径

    Vim 选项卡和缓冲区

    Vim 删除文件中的部分行

    vim - 声明列表字典

    search - 在 vim 中突出显示 find next

    node.js - 在终端中停止 Node 服务器并返回到 vim 中的文件

    vim - 是否可以不使用vim的小删除寄存器?

    c - 如何为在 Vim 中打开的每个新文件自动运行命令