如何将拉出的文本粘贴到Vim命令行?

How to paste yanked text into Vim command line?

我想把拉出来的文本粘贴到vim命令行中。有可能吗?


对。点击ctrl r,然后点击""。如果在所提取的内容中有文字控制字符,请使用ctrl rctrl o""。好的。

下面是一个关于如何使用寄存器的解释。你能用寄存器做的事情是非同寻常的,一旦你知道如何使用它们,你就不能没有它们生活。好的。

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

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

完整参考见:help registers。好的。

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

在插入或命令行模式下,ctrl r加上寄存器名,插入该寄存器的内容。如果您想从字面上插入它们(不自动缩进,不将控制字符(如0x08转换为backspace等),可以使用ctrl rctrl o、寄存器名称。参见:help i_CTRL-R和以下段落以获取更多参考。好的。

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

  • 在正常模式下,点击":p。在vim中使用的最后一个命令被粘贴到缓冲区中。让我们分解:"是一个正常模式命令,允许您选择在下一次扬克、删除或粘贴操作中要使用的寄存器。所以":选择冒号寄存器(存储最后一个命令)。那么p是一个您已经知道的命令,它粘贴寄存器的内容。好的。

    参见:help":help quote_:。好的。

  • 您正在编辑一个VIML文件(例如您的.vimrc文件),现在要执行几个连续的行:yxkbdxkbdxbbdxkbdxkbd:xkbd@"xkbdenterakbd"。这里,yjbbdjbbkbd将当前和下一行(这是因为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中的寄存器名),并将其转换为int。o第三个参数中指定的模式,V表示线条,不表示字符,文字^V表示块。好的。

    参见:help setreg()。反向函数是getreg()getregtype()。好的。

  • 如果你用qaq录制了一个宏,那么:echo @a会告诉你你键入了什么,@a会重放这个宏(可能你知道这个宏,为了避免重复的任务很有用)。好的。

    参见:help qhelp @。好的。

    上一个例子的推论是:如果剪贴板中有8go,那么@+将以宏的形式播放剪贴板内容,从而转到文件的第8个字节。实际上,这几乎适用于每个寄存器。如果您最后插入的字符串是插入模式中的dd,那么@.将(因为.寄存器包含最后插入的字符串)删除一行。(VIM文件在这方面是错误的,因为它指出,寄存器#%:.只适用于pp:putCtrL rabbd)。好的。

    参见:help @。好的。

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

    值得注意的例外是@:。命令寄存器不包含初始冒号,也不包含最终回车。然而,在正常模式下,@:将按您的期望执行,将寄存器解释为一个ex命令,而不是尝试在正常模式下播放。因此,如果您最后一个命令是:e,那么寄存器包含e,但@:将重新加载文件,而不是转到单词结尾。好的。

    参见:help @:。好的。

  • 在运行它之前,显示您将在正常模式下执行的操作:@='dd'enter。当你点击=键时,vim就切换到表达式评估:当你输入一个表达式并点击enter时,vim计算它,结果作为寄存器内容。当然,寄存器=是只读的,只有一次。每次开始使用它时,都必须输入新的表达式。好的。

    参见:help quote_=。好的。

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

  • 手工定义搜索模式::let @/ = 'foo'。好的。

    参见:help :let。好的。

    注意,这样做,您就不需要在模式中逃避/。当然,你需要把所有的单引号都加倍。好的。

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

    使用大写寄存器名使寄存器以附加模式工作好的。

    更好的办法是,如果mswin.vim没有重新映射Q,用Q启动ex模式,将那些实际上更好称为"ex命令"的"colon命令"链接起来,然后通过键入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,您可以得到最后删除的行。但实际上,您也可以通过@9使用寄存器@1恢复最多9次删除。好的。

    更好的是,如果你在正常模式下使用"1P,那么.将在正常模式下播放"2P,依此类推。好的。

    参见:help .:help quote_number。好的。

  • 如果要在插入模式下插入当前日期:ctrl-rabkb=strftime('%y%m%d')enter。好的。

    参见:help strftime()。好的。

又一次,什么会让人困惑:好的。

  • :@是一个命令行命令,它将寄存器的内容解释为vimscript并源于它
  • 正常模式下的@命令,将寄存器的内容解释为正常模式击键(使用:寄存器时除外,该寄存器包含最后播放的没有初始冒号的命令:在这种情况下,它会像重新键入冒号和最终返回键一样重播命令)。好的。

  • "在正常模式下的命令,帮助您选择一个寄存器进行扬克、粘贴、删除、更正等操作。好的。

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

好啊。


对于粘贴系统剪贴板的内容,您只需使用shift-in

它在Windows中工作,但我猜它在Linux中也工作得很好。


"我想将被提取的文本粘贴到VIM命令行中。"

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

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

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

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


要将系统剪贴板中的内容粘贴到VIM命令行("命令模式"),请使用ctrl+r,后跟+。对我来说,至少在Ubuntu上,shift+ins不工作。

PS:不知道为什么CtrL+rabbbd后接*,理论上与CtrL+rabbd后接+一样,似乎并不总是有效。我搜索并发现了+版本,它似乎总是有效,至少在我的盒子里是这样。


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


这个问题已经很古老了,但既然它已经被看过很多次了,它似乎很流行——我会把它放在这里留给子孙后代。对于上下文,这个信息来自于开箱即用的LinuxMint中没有插件,没有使用默认选项的vimrcVim7.4行为。

您可以使用鼠标选择文本(或使用v或v并将所选内容放入"*寄存器"),然后使用shift-ctl-v将其粘贴到命令行中。

在命令行中键入ctl-r将导致提示输入寄存器名。所以键入:ctl-r*将把内容寄存器*放入命令行。它将粘贴任何寄存器,而不仅仅是"*"。请参阅:帮助c_ctrl-r。

此外,鼠标中键将粘贴到命令行中。有关x11如何处理选择的说明,请参见:帮助->Quote Plus。即使在一个普通的,outta-the-box-vim(同样,在linux-mint的vim 7.4中,无论如何),用鼠标左键所做的任何选择都可以用鼠标中键粘贴到命令行中。

此外,鼠标中键还可以将vim中选择的文本粘贴到许多其他x11应用程序中,甚至可以将GUI应用程序(如firefox、thunderbird)粘贴到命令行中,也可以将文本从其他应用程序中选择。

有关addl信息,请参见:帮助->x11选择。

DR

首先尝试:ctl-r方法,然后使用shift-ctl-v或鼠标中键(如果您需要其他东西)。

人们承认这可能会令人困惑。


OSX

如果您在MacOSX中使用VIM,不幸的是它附带了老版本的Verion,并且不符合剪贴板选项。幸运的是,自制啤酒可以很容易地解决这个问题。

安装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中复制该行,并在系统范围内粘贴它。


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

1
:call VimuxRunCommand("python")

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

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

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

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

在中传递未命名寄存器的内容,并使用双引号和多行Edgecases。


  • "[a-z]y将文本复制到〔A-Z〕寄存器;

  • 使用:!go to edit命令;

  • CTRL+R按照注册标识粘贴所复制的内容。

  • 它曾经是中央7号。