在 VIM 中猛拉一个区域而不让光标移动到块的顶部?

有没有一种简单的方法(即不编写脚本或精心设计的关键字序列)可以拖拽一组行,并将光标留在执行“拖拽”的任何地方,而不是留在块的开头?

根据 VIM 的帮助: “请注意,在执行一个字符类型的 yank 命令之后,VIM 将光标留在第一个被 yank 的字符上,该字符最接近缓冲区的开始。”线条方面的行为似乎相似。

这对我来说有点烦人,因为我倾向于从上到下选择一个较大的区域,然后粘贴在接近或低于所选区域的底部。今天我在 Yank 之前设置一个标记(m-x) ,然后跳回去,但是我怀疑可能会有一个不同的 Yank 序列来满足我的需要。

我已经在网上搜索了无数次了。有这么多现有的“ VIM 快捷方式”材料涉水通过,但我还没有找到一个解决方案,这一个。

先谢谢你。

10110 次浏览

如果您使用的是可视块(v) ,那么在猛拉该块之后,您可以使用 gv重新选择相同的块(这也将您的光标位置移回到猛拉之前的位置)。如果然后按 Esc,则不移动光标就取消选定该块。

还可能感兴趣的是可视块模式下的 ctrl-o命令,它在所选块的开始和结束之间跳转。

没有完全回答你的问题,但也许 ']可以解决你的问题?

 ']  `]         To the last character of the previously changed or
yanked text.  {not in Vi}

:y3将从当前行中拉出整整三行,如果您确切地知道要拉出多少行,这个命令非常方便。详情请参阅 :help :yank

:%y将在不移动光标的情况下选择整个缓冲区, 像 ggvG$y,没有选择高亮闪光和修改 "*寄存器。

我使用这个插入模式映射:

function! SelectAll()
%y*
endfun
imap <expr> <F3> SelectAll()

Ps: 如果你喜欢粘贴 <C-V>(外部 vim) ,使用 %y+

检查 https://stackoverflow.com/a/1620030/2247746

我不确定 YankRing 在发布 vmap ygv<Esc>解决方案之后是否发生了变化,但是在将它添加到我的 .vimrc之后,这种情况并没有持续下去。YankRing 实际上覆盖了它。

这是我在 .vimrc中的解决方案。

function! YRRunAfterMaps()
vmap y ygv<Esc>
endfunction

如果在视觉模式下猛拉,你也可以使用 '>`>到刚刚猛拉的视觉选择的最后一行/字符。在这种情况下,这基本上与 ']`]相同,而 `]显然不受支持,例如在 VsVim 中。

我不知道这段时间发生了什么但是在 IdeVim 中接受的答案并不像我希望的那样起作用。(不要在 yank 上移动光标)

对我来说,诀窍就是在拉钩之前做个记号,然后再去拉钩。

vmap y mxy`x