小编典典

如何将抽出的文本粘贴到 Vim 命令行中

all

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


阅读 156

收藏
2022-03-04

共1个答案

小编典典

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

这是对寄存器可以做什么的解释。你可以用寄存器做的事情是非凡的,一旦你知道如何使用它们,你就离不开它们。

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

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

请参阅:help registers完整参考。

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

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

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

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

参看。:help ",:help quote_:

  • 你正在编辑一个 VimL 文件(例如你的.vimrc)并且现在想要执行几个连续的行:y``j``:``@``"``Enter.
    在这里,y``j将当前行和下一行(这是因为 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')然后p.
setreg函数设置名称作为第一个参数(作为字符串)给出的寄存器,用第二个参数的内容对其进行初始化(您可以将寄存器用作变量,@x其中x名称是
VimL 中的寄存器名称),并且将其转换为第三个参数中指定的模式,V对于 linewise,对于 characterwise 和
literal^V对于 blockwise。

参看。:help setreg(). 反函数是getreg()getregtype()

  • 如果你用qa…录制了一个宏q,那么:echo @a它会告诉你你输入了什么,并@a会重播这个宏(可能你知道那个,对于避免重复任务非常有用)

参看。:help q,help @

上一个示例的推论:如果您8go在剪贴板中,则将@+剪贴板内容作为宏播放,从而转到文件的第 8
个字节。实际上,这几乎适用于每个寄存器。如果您最后插入的字符串dd处于插入模式,那么@.将(因为.寄存器包含最后插入的字符串)删除一行。(Vim
文档在这方面是错误的,因为它指出寄存器#%和只能与、 和-:一起使用)。.``p``P``:put``Ctrl``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,则使用 启动 Ex 模式Q,链接那些实际上更好称为“淓x 命令”的“淓命令”,然后键入
回到正常模式visual

参看。:help :g, :help :y,:help Q

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

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

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

参看。:help :range(对于%部分)和:help :y

  • 如果您误录了宏,您可以键入:let @a=' Ctrl-R =replace(@a,"'","''",'g') Enter '并对其进行编辑。这将修改存储在寄存器中的宏的内容,a这里展示了如何使用表达式寄存器来做到这一点。

  • 如果你这样做了dddd,你可能会这样做uu以撤消。有了p你可以获得最后删除的行。但实际上您也可以@1通过@9.

更好的是,如果你这样做了"1P,那么.在普通模式下会播放"2P,等等。

参看。:help .:help quote_number

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

参看。:help strftime()

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

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

  • " 在正常模式下命令,它可以帮助您选择一个用于 yank、paste、delete、更正等的寄存器。

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

2022-03-04