在没有光标移动到块顶部的情况下在VIM中划出一个区域?

时间:2010-09-27 18:18:21

标签: vim

是否有一种简单的方法(即没有编写脚本或精心设计的键映射序列)来抽取一组线并将光标留在执行Yank的任何地方,而不是在块的开头?

根据VIM的帮助:“请注意,在一个字符式的yank命令之后,Vim将光标留在最接近缓冲区起点的第一个被拉出的字符上。”行间似乎表现相似。

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

我已经多次搜索SO和网络了。有很多现有的“VIM快捷方式”材料需要解决,但我还没有找到解决方案。

提前致谢。

6 个答案:

答案 0 :(得分:57)

不完全回答你的问题,但也许']会解决你的问题?

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

答案 1 :(得分:30)

如果您正在使用可视化块(v),那么在对块进行操作后,您可以使用gv重新选择相同的块(这也会将光标位置移回原来的位置)在yanking之前)。如果然后按Esc,则在不移动光标的情况下取消选择该块。

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

答案 2 :(得分:2)

如果在视觉模式下进行游戏,您还可以使用'>`>转到刚刚抽出的视觉选择的最后一行/字符。在此上下文中,这与']`]基本相同,显然不支持,例如在VsVim。

答案 3 :(得分:1)

: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

答案 4 :(得分:0)

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

这是.vimrc中的解决方案。

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

答案 5 :(得分:0)

我不知道其间发生了什么,但是在IdeaVim中,接受的答案无法按我希望的那样工作。 (不要将光标移到yank上)

对我来说,窍门是在拉动之前设置一个标记,然后再进行标记。

vmap y mxy`x