【问题标题】:How to paste yanked text into the Vim command line如何将抽出的文本粘贴到 Vim 命令行中
【发布时间】:2011-04-29 03:58:26
【问题描述】:

我想将抽出的文本粘贴到 Vim 的命令行中。有可能吗?

【问题讨论】:

标签: vim copy-paste


【解决方案1】:

是的。点击 Ctrl-R 然后 "。如果您在拉出的内容中有文字控制字符,请使用 Ctrl- R, Ctrl-O, ".

这里解释了您可以使用寄存器做什么。寄存器可以做的事情非同寻常,一旦你知道如何使用它们,你就离不开它们。

寄存器基本上是字符串的存储位置。 Vim 有许多以不同方式工作的寄存器:

  • 0(抽出寄存器:当您在正常模式下使用 y 时,未指定寄存器,抽出的文本会出现在那里,也会转到默认寄存器),
  • 19 (移位删除寄存器,当您使用 cd 等命令时,已删除的内容进入寄存器 1,寄存器 1 中的内容进入寄存器 2, 等等。 ),
  • "(默认寄存器,也称为未命名寄存器。这是 " 进来的地方 Ctrl-R, "),
  • az 供您自己使用(大写的AZ 用于附加到相应的寄存器)。
  • _(类似于/dev/null (Unix) 或 NUL (Windows),您可以写入它,但它会被丢弃,当您从中读取时,它始终是空的),
  • -(小删除寄存器),
  • /(搜索模式寄存器,当您使用 /?*# 查找文本时更新;您也可以写入它以动态更改搜索模式),
  • :(存储通过 Q: 输入的最后 VimL 命令,只读),
  • +*(系统剪贴板寄存器,您可以写入它们以设置剪贴板并从中读取剪贴板内容)

完整参考请参见:help registers

您可以随时使用:registers 显示所有寄存器的内容。该命令的同义词和简写是:display:reg:di

在插入或命令行模式下,Ctrl-R加上一个寄存器名,插入这个寄存器的内容。如果您想按字面意思插入它们(不自动缩进,不将0x08 等控制字符转换为退格等),您可以使用 Ctrl-R, Ctrl-O,寄存器名。 请参阅:help i_CTRL-R 和以下段落以获取更多参考。

但您也可以执行以下操作(我可能忘记了寄存器的许多用途)。

  • 在正常模式下,点击 ":p。您在 vim 中使用的最后一个命令将粘贴到您的缓冲区中。
    让我们分解一下:" 是一个普通模式命令,可让您选择在下一次 yank、delete 或 paste 操作期间要使用的寄存器。所以 ": 选择冒号寄存器(存储最后一个命令)。然后 p 是一个你已经知道的命令,它粘贴寄存器的内容.

    参见。 :help ":help quote_:

  • 您正在编辑一个 VimL 文件(例如您的 .vimrc)并且现在想要执行几个连续的行:yj :@"输入
    在这里, yj 将当前行和下一行(这是因为 j 是线性运动,但这超出了此答案的范围)拉入默认寄存器(也称为未命名的寄存器)。然后:@ Ex 命令播放存储在作为参数给出的寄存器中的 Ex 命令," 是您引用未命名寄存器的方式。另请参阅此答案的顶部,这是相关的。

    不要将此处使用的 "(它是一个寄存器名称)与上一个示例中的 " 混淆,这是一个正常模式的命令。

    参见。 :help :@:help quote_quote

  • 使用 Ctrl-R, / 以插入模式将最后一个搜索模式插入文件或命令行。

    参见。 :help quote_/, help i_CTRL-R

    推论:保留您的搜索模式,但添加替代模式:/ Ctrl-R, / \|alternative

  • 您在可视模式下选择了一行中间的两个单词,用y 拉出它们,它们在未命名的寄存器中。现在你想在你所在的位置下面打开一个新行,用这两个词::pu。这是:put " 的简写。 :put 命令与许多 Ex 命令一样,只能按行工作。

    参见。 :help :put

    您也可以这样做::call setreg('"', @", 'V') 然后psetreg 函数设置名称作为第一个参数(作为字符串)给出的寄存器,用第二个参数的内容对其进行初始化(您可以将寄存器用作名称为@x 的变量,其中x是 VimL 中的寄存器名称),并将其转换为第三个参数中指定的模式,V 用于 linewise,nothing 用于字符和文字 ^V 用于块。

    参见。 :help setreg()。反向函数为getreg()getregtype()

  • 如果你用qa...q录制了一个宏,那么:echo @a会告诉你你输入了什么,@a会重播这个宏(可能你知道那个,在为了避免重复的工作)

    参见。 :help q, help @

    上一个示例的推论:如果剪贴板中有8go,则@+ 会将剪贴板内容作为宏播放,从而转到文件的第8 个字节。实际上,这几乎适用于每个寄存器。如果您在插入模式下最后插入的字符串是dd,那么@. 将(因为. 寄存器包含最后插入的字符串)删除一行。 (Vim 文档在这方面是错误的,因为它指出寄存器 #%:. 仅适用于 pP:putCtrl -R)。

    参见。 :help @

    不要混淆:@(从寄存器播放 Vim 命令的命令)和 @(从寄存器播放正常模式命令的正常模式命令)。

    值得注意的例外是@:。命令寄存器不包含初始冒号,也不包含最后的回车。但是在正常模式下,@: 会按照您的预期进行,将寄存器解释为 Ex 命令,而不是尝试在正常模式下播放它。因此,如果您的最后一条命令是 :e,则寄存器包含 e@: 将重新加载文件,而不是转到词尾。

    参见。 :help @:

  • 在运行之前显示您将在正常模式下执行的操作:@='dd' Enter。只要你按下= 键,Vim 就会切换到表达式求值:当你输入一个表达式并按下 Enter 时,Vim 会计算它,并将结果作为寄存器内容。当然,寄存器= 是只读的,并且是一次性的。每次开始使用时,都必须输入新的表达式。

    参见。 :help quote_=

    推论:如果你正在编辑一个命令,并且你意识到你应该从你的当前缓冲区中插入一些行到你的命令行:不要按 Esc!使用 Ctrl-R =getline(58) Enter。之后您将返回命令行编辑,但它已插入第 58 行的内容。

  • 手动定义搜索模式::let @/ = 'foo'

    参见。 :help :let

    请注意,这样做,您无需在模式中转义 /。但是,您当然需要将所有单引号加倍。

  • 复制以foo 开头的所有行,然后将所有包含bar 的行复制到剪贴板,链接这些命令:qaq(重置 a 寄存器,其中存储了一个空宏), :g/^foo/y A, :g/bar/y A, :let @+ = @a.

    使用大写寄存器名称使寄存器工作在附加模式

    更好的是,如果Q 没有被mswin.vim 重新映射,则使用Q 启动Ex 模式,链接那些实际上更好称为“Ex commands”的“冒号命令”,然后通过键入返回到Normal 模式visual.

    参见。 :help :g:help :y:help Q

  • 双倍空格您的文件::g/^/put _。这会将黑洞寄存器的内容(读取时为空,但可写,行为类似于 /dev/null)逐行放在每一行之后(因为每一行都有一个开头!)。

  • 在每行之前添加一个包含foo 的行::g/^/-put ='foo'。这是对表达式寄存器的巧妙使用。这里,-.-1 的同义词(参见:help :range)。由于:put 将文本放在行之后,因此您必须明确告诉它对前一行进行操作。

  • 将整个缓冲区复制到系统剪贴板::%y+

    参见。 :help :range(用于% 部分)和:help :y

  • 如果你记错了一个宏,你可以输入:let @a=' Ctrl-R =replace(@a,"'","''",'g') Enter '并编辑它。这将修改存储在寄存器a 中的宏的内容,这里展示了如何使用表达式寄存器来执行此操作。

  • 如果您执行了dddd,您可以执行uu 以撤消。使用p,您可以获得最后删除的行。但实际上您也可以使用寄存器@1@9 恢复多达 9 次删除。

    更好的是,如果你播放"1P,那么普通模式下的. 会播放"2P,以此类推。

    参见。 :help .:help quote_number

  • 如果要在插入模式下插入当前日期:Ctrl-R=strftime('%y%m%d')Enter

    参见。 :help strftime()

再一次,有什么可能令人困惑:

  • :@ 是一个命令行命令,它将寄存器的内容解释为 vimscript 并获取它
  • @ in normal mode 命令将寄存器的内容解释为正常模式击键(除非您使用 : 寄存器,它包含最后播放的命令,但不带初始冒号:在这种情况下,它会重播该命令就像您还重新键入了冒号和最后的返回键一样)。

  • " 正常模式下的命令,可帮助您选择用于拉取、粘贴、删除、更正等操作的寄存器。

  • " 也是一个有效的寄存器名称(默认或未命名的寄存器),因此可以作为需要寄存器名称的命令的参数传递

【讨论】:

  • 不是有一个徽章“答案和问题之间的长度比为 100/1”吗? :)
  • 这是一个很好的答案,但它比 1400 少了大约 900 个字。:)
  • 这个答案改变了我使用 vim 的方式。谢谢贝努瓦
  • 不要忘记 :reg 它将列出所有寄存器及其内容
  • 在最近的 vim 版本中,小于一行的删除进入“小删除寄存器”,而不是进入编号寄存器。参考文献:Vi and VimVi and VimReddit
【解决方案2】:

要粘贴系统剪贴板内容,您只需使用 SHIFT - INS

它适用于 Windows,但我猜它也适用于 Linux。

【讨论】:

  • 是的,也可以在 Linux 中使用。在 Vim 和 GVim 中的 GNOME 下测试。
  • 这实际上将粘贴板作为键盘输入提供给 Vim,因此如果您处于正常模式并粘贴 :!rm -rf /<cr>,它将执行该操作。改用寄存器!
  • @lericson 我不是在回答中说这对系统键盘中的某些东西有用吗?我不明白反对票。以你为例,认真的吗?你真的在剪贴板中有那个吗?你不认为输入shift-insctrl-R+* 更容易吗?当然,如果你在 gvim 中。如果您在连接到另一台机器的终端中并且想从剪贴板粘贴一些内容,您是否知道比shift-ins 更好的内容?因为寄存器在这种情况下不起作用。在您发表评论和做其他事情(例如投票)之前,请三思。
  • 我认为这是错误信息,我已根据该判断采取了行动。
  • 对我不起作用。我刚刚将“”添加到我的命令行中。也许我错过了一些东西。 (Ubuntu 19.04/2:8.1.0320-1ubuntu3.1)。
【解决方案3】:

“我想将抽出的文本粘贴到 Vim 命令行中。”

虽然票数最高的答案非常完整,但我更喜欢编辑命令历史记录。

在正常模式下,输入:q:。这将为您提供最近的命令列表,可使用普通 vim 命令进行编辑和搜索。您将从底部的空白命令行开始。

对于文章所要求的确切内容,将拉出的行(或拉出的任何内容)粘贴到命令行中,拉出您的文本,然后:q:p(进入命令历史编辑模式,然后 (p)ut 您的将文本拉到新的命令行中。随意编辑,回车执行。

要退出命令历史模式,则相反。在命令历史记录中的正常模式下,键入::q + enter

【讨论】:

  • 如果您已经在修改现有命令并且没有按 'q:',请按 ctrl+f,它将调出编辑命令历史记录的功能。
【解决方案4】:

要将系统剪贴板中的内容粘贴到 Vim 命令行(“命令模式”),请使用 Ctrl+R 后跟 + .对我来说,至少在 Ubuntu 上,Shift+Ins 不起作用。

PS:不知道为什么Ctrl+R后面跟着*,理论上和Ctrl是一样的kbd>+R 后跟 + 似乎并不总是有效。我搜索并发现了 + 版本,它似乎总是有效,至少在我的盒子上。

【讨论】:

  • Ctrl-r+ 和 Ctrl-r* 的区别在于前者是普通的剪贴板,但在 Linux 中有第二种类型的剪贴板叫做“primary”,它代表最近选择的文本(从中键鼠标粘贴)。不过,这在 Windows 或 MAC 中不可用
【解决方案5】:

还值得注意的是,抽出寄存器与宏缓冲区相同。换句话说,你可以简单地在你的文档中写出你的整个命令(包括你粘贴的 sn-p),然后"by 将它拉到b 寄存器,然后用@b 运行它。

【讨论】:

    【解决方案6】:

    我遇到了类似的问题。我希望所选文本以命令结尾,但不依赖于粘贴。这是我试图为其编写映射的命令:

    :call VimuxRunCommand("python")
    

    此插件的文档仅显示使用字符串文字。如果您尝试选择包含双引号的文本,以下内容将中断:

    vnoremap y:call VimuxRunCommand("<c-r>"")<cr>
    

    要解决这个问题,您只需使用 @ 引用宏的内容即可:

    vnoremap y:call VimuxRunCommand(@")<cr>
    

    将未命名寄存器的内容传入并使用我的双引号和多行边缘情况。

    【讨论】:

    • 我认为您的最后一个示例缺少“。也许您的意思是 VimuxRunCommand("@")。
    • 这会将@ 字符发送到vimux 命令。将@ 视为转义以下双引号并将其视为寄存器而不是常规字符。我定义的vnoremap 在可视模式下处于活动状态,因此它会拉出选定的文本,然后将其粘贴到 vimux 命令中,将其发送到相邻窗格中正在运行的解释器。非常适合编写脚本并通过几次击键来测试其中的一小部分。
    【解决方案7】:

    就上下文而言,此信息来自具有默认选项的 Linux Mint 中的开箱即用、无插件、无 .vimrc Vim 7.4 行为。

    您始终可以使用鼠标选择文本(或使用 Vv 并将所选内容放在 "* 寄存器中),然后将其粘贴到命令行中Shift + Ctrl + v.

    在命令行中键入 Ctrl + r 将提示输入寄存器名称。因此键入 :CTRL-r* 会将内容寄存器 * 放入命令行。它会粘贴任何寄存器,而不仅仅是“*。见:help c_CTRL-R

    此外,鼠标中键将粘贴到命令行中。

    请参阅:help-&gt;quote-plus,了解 X Window 如何处理选择。即使在普通的、开箱即用的 Vim 中(同样,在 Linux Mint 中的 Vim 7.4 中),使用鼠标左键所做的任何选择都可以使用鼠标中键粘贴到命令行中。

    此外,鼠标中键还可以将在 Vim 中选择的文本粘贴到许多其他 X Window 应用程序中,甚至是 GUI 应用程序(例如,Firefox 和Thunderbird),也可以将文本粘贴到命令行中的文本是从其他应用中选择的。

    查看 :help->x11-selection 了解 addl 信息。

    tl;dr

    首先尝试 :CTRL-r 方法,然后如果需要,请使用 Shift + Ctrl + v 或鼠标中键否则。

    承认这可能会令人困惑。

    【讨论】:

      【解决方案8】:

      OS X

      如果您在 Mac OS X 中使用 Vim,很遗憾它带有旧版本,并且不符合剪贴板选项。幸运的是,Homebrew 可以轻松解决这个问题。

      安装 Vim:

      brew install vim --with-lua --with-override-system-vi

      安装 GUI 版本的 Vim:

      brew install macvim --with-lua --with-override-system-vi

      重启终端使其生效。


      将以下行追加到~/.vimrc
      set clipboard=unnamed

      现在您可以在 Vim 中使用 yy 复制该行并将其粘贴到系统范围内。

      【讨论】:

        【解决方案9】:
        1. "[a-z]y:将文本复制到 [a-z] 寄存器

        2. 使用:!进入编辑命令

        3. Ctrl + R:按照注册标识粘贴复制的内容。

        它曾经用于 CentOS 7。

        【讨论】:

        • “它曾经用于CentOS 7”是什么意思
        【解决方案10】:

        如果您有两个值被拉入两个不同的寄存器(例如寄存器a 和寄存器b),那么您可以简单地设置一个变量c 并对其进行操作。

        例如:set c = str2float(@a) + str2float(@b),然后你可以将c的内容粘贴到任何地方。

        例如,在 INSERT 模式下,CTRL + R 然后键入 = 以进入表达式寄存器,然后在等号后键入 c 并按 ENTER。完成后,您现在应该拥有ab 寄存器的总数。

        所有这些都可以记录在一个宏中并重复一遍!

        str2float 函数在您使用浮点数时使用,如果不使用,您将获得整数。

        我不确定这是否是惯用的,但它适用于我需要连续添加 2 个数字并重复 500 行以上的情况。

        【讨论】:

          【解决方案11】:

          我只是right-click我的鼠标。

          vim fileName打开一个vim文件 按i 进入insert mode。 然后right-click你的鼠标进行粘贴。 我在 VS Code 中编辑并从那里复制。

          【讨论】:

          • 在什么vim编辑器里,我只是好奇,你能右键粘贴吗?
          • 在 PuTTY 中。这不是2个动作。只是right-click
          猜你喜欢
          • 1970-01-01
          • 2021-01-31
          • 1970-01-01
          • 2011-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-11
          相关资源
          最近更新 更多