【问题标题】:Yank a region in VIM without the cursor moving to the top of the block?在 VIM 中拉出一个区域而不将光标移动到块的顶部?
【发布时间】:2023-03-11 09:13:02
【问题描述】:

是否有一种简单的方法(即无需编写脚本或复杂的键盘映射序列)来抽出一组行并将光标留在执行抽出的任何地方,而不是在块的开头?

根据 VIM 的帮助:“请注意,在执行按字符的 yank 命令后,Vim 会将光标留在最接近缓冲区开头的第一个 yank 字符上。” Line-wise 的行为似乎相似。

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

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

提前致谢。

【问题讨论】:

  • 你能举一个改变光标位置的 yank 命令的例子吗?
  • 我在第 1 行,按 V 启动可视行模式。我向下移动 10 行并按 y 拉出该区域。在该命令之后,我回到了第 1 行。也许我在选择期间移动的“东西”在技术上不是光标,但它是我希望在完成拉动后结束的地方。 (所以也许问题应该是“如何在...之后移动光标”)

标签: vim


【解决方案1】:

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

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

【讨论】:

  • 哦,@Greh Hewgill,谢谢,非常感谢!我试图找到解决方案这么久,而且很多次我都看到了类似 zigdon 提供的建议:使用'] 的技巧,但它不能正常工作:如果我从下到上猛拉,那么我的光标将被移回到底部。但是现在,在阅读了您的帖子后,我定义了映射 :vmap y ygv<Esc> ,它就像一个魅力。再次感谢。
  • 我发现这种映射会导致闪烁,尤其是在大拉动时。为避免这种情况,您可以这样做::set lazyredraw
  • 不幸的是,这会导致在从上到下拉动时将多行延伸到当前视图之外的拉动跳转到视图。
【解决方案2】:

没有完全回答您的问题,但也许'] 会解决您的问题?

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

【讨论】:

  • 不错的提示,绝对比我一直在做的更好。
  • 这导致:vmap y y`]
  • @LVB,@Curt,不,这个映射并不能很好地工作:如果我从下往上拉,那么我的光标将移回底部。尝试映射@Greg Hewgill 隐式建议的映射::vmap y ygv<Esc>。这个,真的,就像一个魅力。
  • 很明显(但应该提到)'[ 会转到之前拉出/粘贴的文本的第一个字符。
  • 记录在:h motion.txt
【解决方案3】:

:y3 将从当前行中拉出整整三行,如果您确切知道要拉出多少行,则此命令非常方便。 :help :yank了解详情。

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

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

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

ps:如果你更喜欢 &lt;C-V&gt; 而不是粘贴(在 vim 之外),请使用 %y+

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

【讨论】:

    【解决方案4】:

    我不确定自 vmap ygv&lt;Esc&gt; 解决方案发布以来 YankRing 是否发生了变化,但在将其添加到我的 .vimrc 后,我并没有坚持下去。 YankRing 实际上覆盖了它。

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

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

    【讨论】:

      【解决方案5】:

      如果在可视模式下拉动,您还可以使用'&gt;`&gt; 转到刚刚拉动的可视选择的最后一行/字符。在这种情况下,这与 ']`] 基本相同,这显然不受支持,例如在 VsVim 中。

      【讨论】:

        【解决方案6】:

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

        对我来说,诀窍就是在 yank 之前设置一个标记,然后再进行。

        vmap y mxy`x
        

        【讨论】:

          猜你喜欢
          • 2021-11-21
          • 1970-01-01
          • 2014-07-04
          • 1970-01-01
          • 2011-03-28
          • 2011-06-30
          • 1970-01-01
          • 2017-04-15
          • 1970-01-01
          相关资源
          最近更新 更多