ChatGPT解决这个技术问题 Extra ChatGPT

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

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

有关直接执行抽出文本的特殊情况,请参阅:How do you run a vim command that is the text inside a buffer? - Super User

2
27 revs, 4 users 80%

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

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

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

0(抽出寄存器:当您在正常模式下使用 y 时,未指定寄存器,抽出的文本会出现在那里,也会转到默认寄存器),

1 到 9(移位删除寄存器,当你使用 c 或 d 等命令时,已删除的内容进入寄存器 1,寄存器 1 中的内容进入寄存器 2,等等),

"(默认寄存器,也称为未命名寄存器。这是“在Ctrl-R中出现的地方,”),

a 到 z 供您自己使用(大写的 A 到 Z 用于附加到相应的寄存器)。

_ (类似于 /dev/null (Unix) 或 NUL (Windows),你可以写入它,但它会被丢弃,当你从中读取时,它总是空的),

- (小删除寄存器),

/(搜索模式寄存器,当您使用 /、?、* 或 # 查找文本时更新;您也可以写入它以动态更改搜索模式),

: (通过 Q 或 : 存储最后一个 VimL 键入的命令,只读),

+ 和 *(系统剪贴板寄存器,您可以写入它们以设置剪贴板并从中读取剪贴板内容)

有关完整参考,请参阅 :help registers

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

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

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

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

你正在编辑一个 VimL 文件(例如你的 .vimrc)并且现在想执行几个连续的行:yj:@"Enter。这里,yj yanks 当前和下一行(这是因为 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') then p. setreg 函数设置名称作为第一个参数的寄存器(作为字符串),用第二个参数的内容对其进行初始化(您可以将寄存器用作名称为@x 的变量,其中 x 是寄存器在 VimL 中的名称),并将其转换为第三个参数中指定的模式,V 表示行,没有字符和文字 ^V 用于块。参见:help setreg()。反向函数是 getreg() 和 getregtype() .

如果你用 qa...q 录制了一个宏,那么 :echo @a 会告诉你你输入了什么,@a 会重播这个宏(可能你知道那个,对于避免重复任务非常有用)cf . :help q, help @ 前面例子的推论:如果剪贴板中有 8go,那么 @+ 会将剪贴板内容作为宏播放,从而转到文件的第 8 个字节。实际上,这几乎适用于每个寄存器。如果您最后插入的字符串是 dd 在插入模式下,那么 @.将(因为 . 寄存器包含最后插入的字符串)删除一行。 (Vim 文档在这方面是错误的,因为它指出寄存器 #、%、: 和 . 只能与 p、P、:put 和 Ctrl-R 一起使用)。参看。 :help @ 不要混淆 :@(从寄存器播放 Vim 命令的命令)和 @(从寄存器播放正常模式命令的正常模式命令)。值得注意的例外是@:。命令寄存器不包含初始冒号,也不包含最后的回车。但是在普通模式下,@: 会做你所期望的,将寄存器解释为 Ex 命令,而不是尝试在普通模式下播放它。因此,如果您的最后一个命令是 :e,则寄存器包含 e 但 @: 将重新加载文件,而不是转到词尾。参看。 :帮助 @:

在运行之前显示您将在正常模式下执行的操作:@='dd' Enter。只要你按下 = 键,Vim 就会切换到表达式求值:当你输入一个表达式并按下 Enter 键时,Vim 会计算它,并将结果作为寄存器内容。当然寄存器 = 是只读的,并且是一次性的。每次开始使用它时,您都必须输入一个新的表达式。参看。 :help quote_= 推论:如果你正在编辑一个命令,并且你意识到你应该从你的当前缓冲区中插入一些行到你的命令行:不要按 Esc!使用 Ctrl-R =getline(58) 回车。之后您将返回命令行编辑,但它已插入第 58 行的内容。

手动定义搜索模式: :let @/ = 'foo' cf. :help :let 请注意,这样做,您不需要在模式中转义 /。但是,您当然需要将所有单引号加倍。

复制以 foo 开头的所有行,然后将所有包含 bar 的行复制到剪贴板,链接以下命令:qaq(重置其中存储空宏的 a 寄存器)、:g/^foo/y A、:g/bar/y A , :let @+ = @a.使用大写寄存器名称使寄存器在附加模式下工作更好,如果 Q 没有被 mswin.vim 重新映射,用 Q 启动 Ex 模式,链接那些实际上更好称为“Ex commands”的“冒号命令”,然后返回通过键入视觉进入正常模式。参看。 :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') 输入 ' 并编辑它。这将修改存储在寄存器 a 中的宏的内容,这里展示了如何使用表达式寄存器来执行此操作。修改宏的另一种更简单的方法是将其粘贴到缓冲区(“ap”)中,对其进行编辑,然后通过选择它和“ay.

如果你做了 dddd,你可能会做 uu 来撤消。使用 p 您可以获得最后删除的行。但实际上,您也可以使用寄存器@1 到@9 恢复多达 9 次删除。更好的是,如果你播放“1P”,那么在普通模式下会播放“2P”,以此类推。参看。 :帮助 。和 :help quote_number

如果要在插入模式下插入当前日期:Ctrl-R=strftime('%y%m%d')回车。参看。 :help strftime()

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

:@ 是一个命令行命令,它将寄存器的内容解释为 vimscript 并获取它

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

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

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


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

要粘贴系统剪贴板,您可以使用 SHIFT - INS。

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


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

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

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

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

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

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


如果您已经在修改现有命令并且没有按 'q:',请按 ctrl+f,它将调出编辑命令历史记录的能力。
P
Peter Mortensen

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

PS:我不确定为什么 Ctrl+R 后跟 *,理论上与 Ctrl+R 后跟 + 相同,似乎并不总是有效。我搜索并发现了 + 版本,它似乎总是有效,至少在我的盒子上。


Ctrl-r+ 和 Ctrl-r* 的区别在于前者是常规剪贴板,但在 Linux 中有第二种类型的剪贴板,称为“primary”,表示最近选择的文本(鼠标中键从中粘贴) .虽然这在 Windows 或 MAC 中不可用
n
naught101

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


P
Peter Mortensen

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

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

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

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

有关 X Window 如何处理选择的说明,请参见 :help->quote-plus。即使在一个普通的、开箱即用的 Vim 中(同样,在 Linux Mint 的 Vim 7.4 中,无论如何),使用鼠标左键所做的任何选择都可以使用鼠标中键粘贴到命令行中。

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

有关 addl 信息,请参阅 :help->x11-selection。

tl;博士

首先尝试 :CTRL-r 方法,然后在需要其他内容时使用 Shift + Ctrl + v 或鼠标中键。

承认它可能会令人困惑。


C
Conrad.Dean

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

:call VimuxRunCommand("python")

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

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

为了解决这个问题,您只需使用 @ 引用宏的内容:

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

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


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

"[az]y:将文本复制到 [az] 寄存器使用 :! 转到编辑命令 Ctrl + R:按照寄存器标识粘贴您复制的内容。

它曾经用于 CentOS 7。


“It used to CentOS 7.”是什么意思?
P
Peter Mortensen

操作系统

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

安装 Vim:

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

安装 Vim 的 GUI 版本:

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

重启终端使其生效。


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

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


R
Rafael

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

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

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

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

如果您使用浮点数,则使用 str2float 函数,否则,您将获得整数。

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


T
Tahir Hassan

我喜欢使用 Control-v 从系统剪贴板粘贴,所以我使用:

cnoremap <C-v> <C-r>+