Vim - 防止在将文本复制到标记时光标移动

3

我通常在Vim中使用标记来剪切/粘贴。

要复制第4行和第12行之间的文本,我会按照以下步骤进行:

  1. 将光标移动到第4行
  2. 键入mx以放置名为x的标记
  3. 将光标移动到第12行
  4. 键入y'x以复制第4行和第12行之间的文本

这样做后,光标会回到第4行。

有没有办法使光标停留在原地(而不是回到标记处)?

如果有人知道更好的方法,那就太棒了...

提前感谢!


更新:

我使用FDinoff的答案创建了一个映射,让我非常高兴:

nnoremap YY y'x<C-O>

这会从光标处拉到名为x的标记,然后将光标返回到原来的位置。
这已经为我节省了大量时间。再次感谢!

3
我看不到文档中明显的方法来完成这个操作,但在复制后按Ctrl-O跳回第12行是否足够? - andrewdotn
@andrewdotn - 这是一个很好的开始(也可能是足够的解决方案)...在添加映射后,它将特别有用。谢谢!(如果您想获得一些声望分数,请随意将其作为答案)。 - jahroy
4个回答

9
你跳到第四行的原因是你使用了反向的yank操作。
                            *y* *yank*
["x]y{motion}       Yank {motion} text [into register x].  When no
            characters are to be yanked (e.g., "y0" in column 1),
            this is an error when 'cpoptions' includes the 'E'
            flag.

问题中提到的是'x,它可以跳转到标记x。光标被移动到复制部分的开头,本例中由于从第12行复制,所以光标被移动到第4行。
然而,你可以采取以下措施:
  1. 对于ex命令行模式的复制,请使用范围。范围是从当前行.到标记'x。如果范围反向,Vim会询问你是否意味着另一个方向。这不会移动光标。:.,'xy

  2. 或者,你可以使用<C-o>,它将使你回到你上次跳转的位置。(评论中提到过)。

  3. 或者,你可以使用']`],这些命令将使你跳转到上一次复制文本的最后一个字符。


非常感谢。我既感激您的解释,也感激您提供的替代方案! - jahroy
我不认为这是“原因”,因为大多数yank动作不会移动光标。例如:yj yl y}。我实际上是在寻找一条既可以yank又可以执行动作的命令,这对于像yf3/这样复杂的动作有时很有帮助。我不确定你是否找到了这样的命令? - Michael Scheper
1
@MichaelScheper yank 命令会将光标置于被 yank 的文本开头。在你的所有示例中,光标已经位于被 yank 的文本开头。我暂时不知道如何将光标放置于被 yank 部分的末尾。 - FDinoff

3

使用下列快捷键返回:``CTRL+O

若需更多帮助,请参阅:

:h ``
:h CTRL-O

1

你觉得 y12G 怎么样?
这将从当前位置(第4行)拖动到第12行。


这样做是可行的,但通常在您不知道要拷贝多少行时使用此工作流程。我只是使用第4行和第12行来解释情况。在实际应用中,4和12应该被"通过在文件中导航选择的某个随机行号"所替换。 - jahroy

0

如果我理解正确,您想要将光标保持在第4行。

将光标放在第4行,使用V 12G y

即使是v,我认为您所缺少的只是可视模式

这些动作也会有所帮助。


目标实际上是保持在第12行。返回第4行是默认行为。 - jahroy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接