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


Answers:


1157

是。点击Ctrl- R然后"。如果在你猛拉你有什么字面控制字符,请使用Ctrl- ,R- Ctrl,。O"

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

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

  • 0(猛拉寄存器:当您y在普通模式下使用时,如果未指定寄存器,则猛拉文本会到达该位置,也传到默认寄存器),
  • 19(移动删除寄存器,当您使用诸如c或的命令时d,已删除的内容将进入寄存器1,寄存器1中的内容将进入寄存器2,等等),
  • "(缺省寄存器,也称为无名寄存器这就是。"进来Ctrl- ,),R"
  • az供自己使用(大写AZ针对附加到相应的寄存器)。
  • _(就像/dev/null(Unix)或NUL(Windows)一样,您可以对其进行写入,但是将其丢弃,并且从中读取时,它始终为空),
  • - (小的删除寄存器),
  • /(搜索模式寄存器,当你寻找与文字更新/?*#例如;你也可以写信给它动态地改变搜索模式),
  • :(通过Q或存储:只读的VimL类型的命令,只读),
  • +*(系统剪贴板寄存器,您可以写信给他们设置剪贴板并从中读取剪贴板内容)

请参阅:help registers以获取完整参考。

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

在“插入”或“命令行”模式下,Ctrl- R加上寄存器名称,将插入该寄存器的内容。如果要按原样插入它们(不自动缩进,不将控制字符转换0x08为退格键等),则可以使用Ctrl- RCtrl- O,注册名称。请参阅:help i_CTRL-R和以下段落以获取更多参考。

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

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

    cf. :help ":help quote_:

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

    不要将"此处使用的(这是一个寄存器名称)与"上一个示例(普通模式命令)相混淆。

    cf. :help :@:help quote_quote

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

    cf. :help quote_/help i_CTRL-R

    推论:保持你的搜索模式,但增加一个选择:/ Ctrl- ,。R/ \|alternative

  • 您已在可视模式下在一行的中间选择了两个单词,并用选中了它们y,它们位于未命名的寄存器中。现在,您要在您所在的位置下方打开一个新行,并用这两个词::pu。这是的简写:put ":put与许多Ex命令一样,该命令仅沿行方向起作用。

    cf. :help :put

    您也可以这样做::call setreg('"', @", 'V')然后p。的setreg功能设定,其名称被给定为第一个参数(字符串)的寄存器,与所述第二参数的内容进行初始化(并且可以使用寄存器作为变量的名称@x,其中x是在VimL寄存器名),和将其转换为第三个参数中指定的模式,V对于逐行,对于字符逐字^V,对于块,则字面值。

    cf. :help setreg()。反向功能为getreg()getregtype()

  • 如果您使用qa... 录制了一个宏q:echo @a则将告诉您您键入的内容,@a并将重播该宏(可能您知道一个,对于避免重复性任务非常有用)。

    cf. :help qhelp @

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

    cf. :help @

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

    值得注意的例外是@:。命令寄存器不包含初始冒号,也不包含最终回车符。但是,在普通模式下,@:将执行您期望的操作,将寄存器解释为Ex命令,而不尝试在普通模式下播放。因此,如果您的最后一条命令是:e,则寄存器包含e@:将重新加载文件,而不是字尾。

    cf. :help @:

  • 在运行之前,请显示您将在“普通”模式下执行的操作@='dd' Enter。按下=按键后,Vim就会立即切换到表达式求值:输入表达式并点击时Enter,Vim会对其进行计算,结果将作为寄存器内容。当然,该寄存器=是只读的,并且是一次性的。每次开始使用它时,都必须输入一个新表达式。

    cf. :help quote_=

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

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

    cf. :help :let

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

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

    使用大写寄存器名称可以使寄存器在追加模式下工作

    更好的是,如果Q尚未进行重新映射mswin.vim,则使用来启动Ex模式Q,将实际上更好地称为“ Ex命令”的那些“冒号命令”链接起来,然后通过键入返回普通模式visual

    cf. :help :g:help :y:help Q

  • 将文件加双倍空格::g/^/put _。这会将黑洞寄存器的内容(读取时为空,但可写,表现为/dev/null)按行逐行放置(因为每一行都有一个开始!)。

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

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

    cf. :help :range%部分)和:help :y

  • 如果您录制的宏有误,则可以键入:let @a=' Ctrl- R =replace(@a,"'","''",'g') Enter '并对其进行编辑。这将修改寄存器register中存储的宏的内容a,并在此处显示如何使用表达式寄存器来执行此操作。

  • 如果您这样做了dddd,则可能uu需要撤消操作。随着p你可以得到最后删除的行。但是实际上,您也可以@1通过寄存器恢复多达9个删除操作@9

    更好的是,如果您这样做"1P,则将.在“普通”模式下播放"2P,依此类推。

    cf. :help .:help quote_number

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

    cf. :help strftime()

再一次,可能会引起混淆:

  • :@ 是一个命令行命令,它将寄存器的内容解释为vimscript并提供其来源
  • @ 在普通模式下将寄存器内容解释为普通模式击键的命令(使用:寄存器时除外,该寄存器包含上次播放的命令而没有初始冒号:在这种情况下,它将重播该命令,就像您也重新键入了冒号并最后的返回键)。

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

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

205
没有徽章“答案和问题之间的长度比为100/1吗?” :)
Benoit

8
这是一个很好的答案,但比1400还短900个字。:)

19
这个答案改变了我使用vim的方式。感谢Benoit
P. Myer Nore

11
不要忘记:reg,它将列出所有寄存器及其内容
eugenevd 2013年

3
在最新版本的vim中,小于一行的删除将进入“小删除寄存器”,而不是进入编号寄存器。参考:Vi和VimVi和VimReddit
Christian Long

48

要粘贴系统剪贴板中的内容,您可以使用SHIFT- INS

它可以在Windows中运行,但我猜它也可以在Linux中运行良好。


7
是的,在Linux中也可以。在Vim和GVim中均在GNOME下进行了测试。
Teoulas

3
实际上:!rm -rf /<cr>,这会将粘贴板作为键盘输入提供给Vim,因此,如果您处于正常模式并粘贴,它将执行该操作。请改用寄存器!
lericson

4
@lericson我不是在回答中说这对于系统键盘中的某些功能有用吗?我不明白那票选票。以您为例,是认真的吗?你真的在剪贴板上吗?而且您不认为键入shift-ins比这容易ctrl-R+*吗?当然,如果您使用的是gvim。如果您在连接到另一台计算机的终端中,并且想要从剪贴板粘贴某些内容,您是否知道比这更好的东西shift-ins?因为寄存器在这种情况下不起作用。在发表评论或做其他事情(例如投票)之前,请先三思。
2012年

我认为这是错误信息,我已根据该判断采取了行动。
lericson

1
对我不起作用。我只是在命令行中添加了“ <S-Insert>”。也许我缺少了一些东西。(Ubuntu 19.04 / 2:8.1.0320-1ubuntu3.1)。
马克斯·沃特曼

39

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

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

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

对于本文要求的确切内容,将一条被拉线的行(或被拉动的任何东西)粘贴到命令行中,拉动文本,然后:(q:p进入命令历史记录编辑模式,然后(p)将被拉动的文本放入新命令中行,enter可随意编辑以执行。

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


1
如果您已经在修改现有命令并且没有按'q:',请按ctrl + f,它将拉动编辑命令历史记录的功能。
Clay

14

要将某些内容从系统剪贴板粘贴到Vim命令行中(“命令模式”),请使用Ctrl+ R后跟+。对我而言,至少在Ubuntu上,Shift+ Ins无法正常工作。

PS:我不确定为什么Ctrl+ R后跟*,理论上与Ctrl+ R后跟+似乎并不总是一样。我搜索并发现了该+版本,它似乎总是可以运行,至少在我的盒子上。


2
Ctrl-r +和Ctrl-r *之间的区别在于,前者是常规剪贴板,但是在Linux中,第二种类型的剪贴板称为“主要”,代表最新选择的文本(从中粘贴鼠标中键) 。不过,这在Windows或MAC中不可用
Matias Thayer

13

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


1

我有一个类似的问题。我希望选定的文本以命令结尾,但不依赖于粘贴。这是我尝试为其编写映射的命令:

:call VimuxRunCommand("python")

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

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

要解决此问题,您只需使用引用宏的内容@

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

传入未命名寄存器的内容,并使用我的双引号和多行边线。


我觉得你的最后一个例子是缺少”也许你的意思VimuxRunCommand。(‘@’)。
kd8azz

这会将@字符发送到vimux命令。考虑到@将以下双引号转义,并将其视为寄存器而不是常规字符。在vnoremap我定义是在视觉模式下有效,所以它猛拉选定的文本,然后将其粘贴到vimux命令,在相邻的窗格将其发送到正在运行的解释器。对于编写脚本并通过几次击键测试脚本的一小部分而言,这确实很棒。
Conrad.Dean,2015年

1

OS X

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

安装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

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


1

对于上下文,此信息来自现成的,没有插件,没有使用默认选项的Linux Mint中的.vimrc Vim 7.4行为。

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

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

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

看到 :help->quote-plus X窗口如何处理选择的说明,。即使在开箱即用的普通Vim中(无论如何,在Linux Mint中还是在Vim 7.4中),使用鼠标左键所做的任何选择都可以使用鼠标中键粘贴到命令行中。

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

有关附加信息,请参见:help-> x11-selection。

tl; dr

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

承认它可能会造成混淆。


0
  1. "[a-z]y:将文本复制到[az]寄存器

  2. 使用:!去编辑命令

  3. Ctrl+ R:按照注册者的身份粘贴要复制的内容。

它曾经用于CentOS 7。


什么是“它曾经用于CentOS 7”。
Peter Mortensen

0

如果将两个值连接到两个不同的寄存器(例如register a和register b)中,则可以简单地设置一个变量c并对它进行操作。

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

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

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

str2float如果使用浮点数,则使用该函数;如果不使用浮点数,则将获取整数。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.