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

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


是。 然后按Ctrl-R键“,如果你有字面控制字符,你可以使用Ctrl-R,Ctrl-O”。

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

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

  • 0 (yank寄存器:当你在正常模式下使用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中使用的最后一个命令被粘贴到你的缓冲区中。
    让我们来分解一下: "是一个普通模式命令,它允许你选择在下一次抽签,删除或粘贴操作期间使用哪个寄存器,因此”:选择冒号寄存器(存储最后的命令)。 然后p是你已经知道的命令,它粘贴寄存器的内容。

    比照 :help ":help quote_:

  • 你正在编辑一个VimL文件(例如你的.vimrc文件),并且现在想要执行几行连续的行:yj:@“Enter。
    在这里,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,没有代表字符和文字^V代表blockwise。

    比照 :help setreg() 。 相反的功能是getreg()getregtype()

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

    比照 :help qhelp @

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

    比照 :help @

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

    值得注意的例外是@: :。 命令寄存器不包含最初的冒号也不包含最终的回车。 然而在正常模式下, @:会做你期望的,把这个寄存器解释为一个Ex命令,而不是试图在普通模式下播放它。 所以如果你的最后一条命令是:e ,寄存器包含e但是@:将重新加载文件,而不是结束。

    比照 :help @:

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

    比照 :help quote_=

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

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

    比照 :help :let

    请注意,这样做,你不需要逃避/在模式中。 但是,当然你需要加倍所有单引号。

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

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

    更好的是,如果Q没有被mswin.vim映射,用Q启动Ex模式,链接那些实际上更好地称为“Ex命令”的“冒号命令”,并通过键入visual返回到正常模式。

    比照 :help :g:help :y:help Q

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

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

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

    比照 :help :range (对于%部分)和:help :y

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

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

    更妙的是,如果你这样做"1P ,那么.在正常模式下将发挥"2P ,等等。

    比照 :help .:help quote_number

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

    比照 :help strftime()

  • 再一次,可能会令人困惑的是:

  • :@是一个命令行命令,它将寄存器的内容解释为vimscript并将其发送
  • @在正常模式命令中,将寄存器的内容解释为正常模式击键(除了当您使用: register时,包含最后播放的命令而没有初始冒号:在这种情况下,它将重放命令,就好像您也重新输入了冒号和最终返回键)。

  • "在正常模式命令,可帮助您选择一个寄存器来抽出,粘贴,删除,更正等。

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

  • 对于粘贴系统剪贴板的东西,您可以使用SHIFT - INS。

    它在Windows中工作,但我猜测它在Linux中也能很好地工作。


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

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

    在正常模式下,输入: q: 这会给你一个最近的命令列表,可以用普通的vim命令编辑和搜索。 您将从底部的空白命令行开始。

    对于文章所要求的确切的事情,将一个被抽出的线粘贴到一个命令行中(或者将任何东西抽出)放入命令行中,然后抽出你的文本,然后: q:p (进入命令历史编辑模式,然后(p)一个新的命令行。随意编辑,进入执行。

    要摆脱命令历史模式,情况正好相反。 在命令历史记录的正常模式下,输入:q + enter

    链接地址: http://www.djcxy.com/p/8717.html

    上一篇: How to paste yanked text into Vim command line?

    下一篇: Vim Python indentation not working?