我有一些在正常模式下移动光标的函数,例如:
function! s:Skip(distance, direction)
execute "normal! ".string(a:distance).a:direction
endfunction
其中,a:distance
是整数,a:direction
类似于'h'
或'l'
。这在正常模式映射中可以很好地工作,但是我想将这些动作扩展到可视模式。
问题在于,在可视模式下运行的execute "normal! etc..."
命令不起作用(即不执行光标移动,就像在正常模式下选择原始和最终光标位置之间的文本)。一个解决方法是:退出可视模式,放置标记,执行skip()
,然后从新的光标位置到标记之间进行可视化选择。我不喜欢这个解决方案,不仅因为它需要一个标记,而且因为它也不“感觉”像将正常模式移动转换为可视模式移动的正确方式。
有什么建议吗?我应该指出,我有许多像skip()
这样执行execute "normal! movement..."
的函数,因此最好有一个通用规则,而不是一次性的、零散的解决方案(如标记,如果是这种情况)。将我执行正常模式移动的方式从execute "normal! etc..."
更改为其他方式是完全可以的。
谢谢!
string(a:distance)
;Vim 会自动将数字转换为字符串。 - Ingo Karkat4l
后,您的光标向左移动4次,您希望选择范围保持不变吗?这意味着新的光标位置位于选择区域的“中间”位置吗?还是您只想更改可视选择区域的4个字符?(取决于您当前的光标位置,即选择区域的开头或结尾) - Kentskip()
是execute "normal! 4l"
,那么在可视模式下它应该等同于4l
(即它会将光标向左移动4个字符,以便您选择4个字符并将光标停留在第四个字符上)。 - jayflo