【问题标题】:How to simplify "copy and paste" in Vim?如何简化 Vim 中的“复制和粘贴”?
【发布时间】:2018-03-10 07:44:59
【问题描述】:

我发现在 VIM 中复制和粘贴的过程非常棘手:

  • 视觉模式
  • p(或移位 p)
  • 插入模式

如果你错误地使用了“delete”键,你丢失了内容(被你删除的字符替换),你必须重新复制它!

我在 vim 上工作几个月了,我喜欢它,但我讨厌复制和粘贴,有没有办法简化它?还是其他的?

谢谢

【问题讨论】:

  • 无需进入可视模式复制。只是 Yp 应该复制并粘贴当前行。
  • 我知道 Rajendran,但我怎么说,当您编辑时可能使用“删除”按钮,并且您丢失了内容,因此您需要重新复制它(无论如何您必须搬进去过去的命令模式:Esc + y + p + i(返回插入模式)
  • 是的 :) 我已经多次感到不便。

标签: vim editor


【解决方案1】:

Vim 在numbered registers 中维护您最近进行的 9 次删除的列表。所以"0p 将粘贴您最近删除的内容,"1p 将粘贴您删除或更改的第二个最近的内容(注意这不包括被简单删除的文本),依此类推,用于寄存器 2-9 .

如果您想使用超过最后 9 个已删除的项目,或者如果您想要一种简单的方法来访问以前的 yanks,我建议您使用 yankring 插件,除其他外,它可以让您查看最后 100 个 yanks 并选择哪个一个你想用:YRShow 命令粘贴的。

最后,如果你想粘贴而不离开插入模式,你可以使用Ctrl-R 插入任何寄存器的内容。因此,在插入模式下,键入 <Ctrl-R>" 将插入未命名寄存器 " 的内容(这是在未指定寄存器时放置被抽出的文本的位置)。

【讨论】:

  • 你不是说"0p"1p等吗?
  • +1 我已经使用 gVim 好几年了,但是编号寄存器和 Ctrl-R 对我来说都不熟悉。
  • 我是关于 Ctrl-o 的新消息,但不是“Ctrl-R”。感谢那。 +1
  • "0p 将粘贴您最近 yanked 的内容,而不是 yanked 和删除的"1p 将为 deleted 执行此操作,only 为已删除,同样适用于 "2p(第二个最近删除的内容)等等。你可以在:h quote_number找到这个。
  • 我从来不知道复制和粘贴可以成为如此广泛的精确工具。
【解决方案2】:

虽然不是完全“简化”,但您可以选择将文本复制到与默认删除文本所在位置不同的寄存器中。这样可以防止您因意外删除某些内容而丢失复制的内容。

要复制到注册a(例如),您可以执行以下操作:

" a y [移动命令]

然后粘贴你会做的文本:

" a p

您还可以做一件事。如果要在插入模式下粘贴,可以按ctrl+o,然后输入粘贴命令(例如我上面提到的注册粘贴命令)。 ctrl+o 命令等同于按 esc,但只有一个命令。阅读更多关于它的信息here

最后,您始终可以选择编写一个 vim 脚本来根据自己的喜好更改默认行为(或者可能找到一个插件,例如 yankring)。


更新

基于与kellogs 在 cmets 中的对话,我决定研究如何使用任何寄存器进行复制/粘贴,但在复制命令的可视模式下(更容易直观地看到您正在抓取的内容)。事实证明这是可能的。

复制到注册a,但在可视模式下:

v(进入视觉模式)

那你和上面一样,但是先做移动命令:

[movement command] "ay(通过移动命令突出显示您的选择,然后拉入注册a)。

按照UPDATE上面列出的正常方式进行粘贴。

【讨论】:

  • 不知道为什么它不适合你。我刚刚打开一个随机文本文件,移动到任意行并输入以下内容:" a y 2 w 从我当前的光标位置拉出 2 个单词并将它们存储在寄存器 a 中。然后我可以通过" a p 粘贴(在多个位置进行了尝试,包括同一个文件、一个新选项卡、一个不同的现有文件)。
  • 我可能想重试。是否有任何视觉确认?
  • 并非如此。在我的示例中,这与您刚刚输入 y 2 w(抽出 2 个字)并使用默认寄存器而不是寄存器 a 相同。您的光标会改变形状(在我的 GVIM 版本中),并且还会在状态行中显示所有按键。一旦你按下最后一次按键(在这种情况下为w),光标就会恢复正常。
  • 确实有效。但是没有视觉模式就很麻烦了:/
  • 找到了一种在可视模式下执行此操作的方法并添加了更新。查看更新(基本上进入可视模式,然后不是" a y 2 w,而是2 w " a y,其中移动命令首先出现而不是最后出现)。
【解决方案3】:

当你删除某些东西时,Vim 不会完全丢弃被拉出的文本,它只是覆盖" 寄存器。最后抽出的文本始终存储在寄存器0 中,因此您可以在工作流程中将p 替换为"0p,或者更好地将其映射到,p 并使用它:

nnoremap ,p "0p
xnoremap ,p "0p

另一种方法是丢弃已删除的文本(删除到黑洞寄存器_):"_dd"_x 等等。我个人为此使用,d 映射:

nnoremap ,d "_d
xnoremap ,d "_d

在这种情况下,Vim 不会覆盖任何寄存器。

第三个是使用字母寄存器,正如@Jason Down 建议的那样。

【讨论】:

  • 好主意。也为了完整性: nnoremap ,D "_D​​ xnoremap ,D "_D​​ nnoremap ,x "_x xnoremap ,x "_x
【解决方案4】:

对我来说,最简单的解决方案是创建一个键组合映射,以模态方式关闭或打开此删除副作用。

在我的脚本就位后,我输入 , 并处于“无副作用”模式,因此删除文本对我的 yank 缓冲区没有影响,所以我可以随意有效地进行 yank-delete-paste 任何我喜欢的事情.

完成后,我再次键入 ,, 并且 vim 会返回其默认行为,并带有删除键的副作用。

我发现这个解决方案非常理想,因为我不需要在每次想要复制粘贴时都考虑缓冲区。脚本见这里:

vim toggling buffer overwrite behavior when deleting

【讨论】:

    【解决方案5】:

    当我不想改变模式时,我只是使用系统剪贴板复制和粘贴。

    或者我使用CTRL-Y,如果我只是从上一行复制字符。

    如果您想从缓冲区的其他位置复制整行内容,请键入前几个字符并使用CTRL-X CTRL-L

    更多信息,请咨询:

    【讨论】:

      【解决方案6】:

      没有什么需要简化的——这就是 Vim 的工作原理。嗯,或多或少。

      但是,关于您的删除问题(因此,替换寄存器的内容)- 例如,您可以使用YankRing。它为 Vim 的 yank/paste 操作提供了一些“用户友好性”。


      它是如何工作的?

      您转到 first 行,然后将其拉出(Windows 术语中的“复制”)。然后你转到 second 行并拉动它。然后你到 第七 行并拉出那一行。

      然后你去......任何地方,然后粘贴(!)。你得到最后(第七)行。按下快捷键,最后的粘贴将替换为上一个 yank(second 行)。再次...... 第一行:)

      因此,这样一来,您就不必担心丢失被拉出的内容,据我所知,这是您的主要问题。

      【讨论】:

        【解决方案7】:

        Vi(和 Vim)与 Gedit 等普通文本编辑器的工作方式大不相同。它也有一个相当陡峭的学习曲线。如果您想学习一些基本命令,请从这个交互式教程开始。

        但是,回答你的问题。可以通过加号寄存器访问系统剪贴板的内容。因此,要从系统剪贴板粘贴某些内容,您可以在普通模式下按:“+p(不是同时,而是一个接一个)。

        【讨论】:

          【解决方案8】:

          问题是,您不应该“返回插入模式”。

          编辑(拉动、删除、替换等)在普通模式下完成,插入模式仅用于输入文本。

          如果您处于插入模式并希望重复使用文档中其他地方已经存在的一些文本,您可以点击:

          • <C-n><C-p> 插入以光标左侧字符开头的单词
          • <C-x><C-l> 插入以光标左侧字符开头的行

          【讨论】:

            猜你喜欢
            • 2020-08-16
            • 1970-01-01
            • 2014-09-18
            • 1970-01-01
            • 2020-02-06
            • 1970-01-01
            • 2021-01-31
            • 1970-01-01
            • 2012-07-14
            相关资源
            最近更新 更多