【问题标题】:Why vim pasting behaves differently depending on yanking method为什么 vim 粘贴的行为会因 yanking 方法而异
【发布时间】:2019-04-04 09:02:32
【问题描述】:

根据我拉线的方式,我看到不同的粘贴行为。我想知道为什么。

如果我从普通模式开始拉线:

^v$y

^ 转到行首

v进入可视模式

$ 转到行尾

y 拉拽

然后我使用p 进行粘贴,它按预期工作。

但是,当我从正常模式开始并按行使用视觉模式时:

Vy

V 逐行进入视觉模式

y 拉拽

然后我用p粘贴,我看到该行粘贴在当前行的下方。就像粘贴操作是先打开一个新行然后粘贴到那里。

示例。开头的几行:

Line1
Line2
Line3. Insert here 

我使用方法 1 拉出 Line2。

我将光标移动到 Line3 的点,然后按p 进行粘贴。我得到了这个结果:

Line1
Line2
Line3.Line2 
 Insert here

但是当我使用 yanking 方法二做同样的事情时,我得到了这个结果:

Line1
Line2
Line3. Insert here
Line2

如果 :registers 的内容在两种情况下都相同,为什么粘贴的效果会不同?

编辑:

找到答案here

即使寄存器内容相同;寄存器的类型会根据提取方法而有所不同,并且不同的寄存器类型会使粘贴做不同的事情。

【问题讨论】:

    标签: vim paste yank


    【解决方案1】:

    说明

    如果您仔细观察,您应该会发现您使用的是v$ 还是V

    :registers ab
    --- Registers ---
    "a   foo
    "b   foo^J
    

    ^J换行符,表示整行已被拉出。

    运动要么影响整行,要么影响开始和结束位置之间的字符。在 Vim 内部,这被称为 :help linewise 和字符。这同样适用于可视模式(<C-V> 有第三种模式,称为分块)。所以,你如何拉东西会有所不同!您可以在 :registers 命令中看到这一点,也可以通过 :help getregtype() 函数查询它,但在实践中,这很少会让人感到意外(一旦您掌握了这个概念)。

    使用插件启动

    我经常需要将寄存器内容“转换”为某种(按字符/按行/按块)模式,为此我写了UnconditionalPaste plugin。它提供了 gcpglp 等替代内置粘贴命令的替代方案,这些命令强制执行某种模式(现在这个主题还有更多变体,比如用逗号或查询字符连接的粘贴)。

    有了它,您可以使用gcp / gcP 在光标位置之后/之前粘贴,无论您如何拉动文本(例如,通过V 从线性可视模式,如您的问题)。

    【讨论】:

    • 在我的情况下,我看到寄存器的内容在两种提取方法中完全相同,包括最后的回车。如果寄存器的内容相同,为什么粘贴的工作方式不同?
    • 你有:set virtualedit=onemore吗?然后你在v$y 中包含换行符。但是,类型仍然是按字符的,所以在粘贴时,尾随换行符会在那里,但不会在开头添加新行 - 与 Vy 发生的情况相反。
    • 使用:echo getregtype('"') 可以清楚地看到这一点;这就是 Vim 粘贴类型的基础。 :registers 输出不是 100% 等效的(但它通常是不同的极端情况)。
    • 我没有 :set virtualedit=onemore 但我看到的寄存器类型因拉取方法而异。感谢您为我指明正确的方向。
    • 啊,很好!您在问题中链接到的另一个问题也提到了getregtype(),就像我的回答一样。请单击概述的复选标记接受我的回答。这样一来,问题就会被标记为已结束,从而增加获得未来问题答案的机会,因为这表明您关心答案。
    【解决方案2】:

    找到答案here

    即使寄存器内容相同;寄存器的类型会根据拉取方法而有所不同。寄存器类型使粘贴变得不同。 你可以通过输入:echo regtype('"')来查看给定寄存器的寄存器类型

    【讨论】:

      【解决方案3】:

      我会推荐yg_ 而不是Vy,也可以是vg_y,但您需要输入一个额外的字符。所以:

      yg_ ................... yank until the last character of the line
      

      OBS:g_ 不包含换行符。更多:h g_

      从行的第一个字符到最后一个不换行:

      _vg_
      
      _ ............... jump to the first non-blank char
      v ............... visual
      g_ .............. las non-blank of the line
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-19
        • 2016-05-02
        • 2010-11-18
        • 2014-10-05
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多