如何将抽取的文本粘贴到Vim命令行中?
我想将抽取的文本粘贴到Vim命令行中。 可能吗?
是。 然后按Ctrl-R键“,如果你有字面控制字符,你可以使用Ctrl-R,Ctrl-O”。
这里解释一下你可以用寄存器做什么。 你可以用寄存器做什么是非同寻常的,一旦你知道如何使用它们,你就离不开它们。
寄存器基本上是字符串的存储位置。 Vim有许多以不同方式工作的寄存器:
0
(yank寄存器:当你在正常模式下使用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,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')
然后p
。 setreg
函数将给定名称的寄存器设置为第一个参数(作为字符串),使用第二个参数的内容对其进行初始化(并且可以将寄存器用作名称为@x
变量,其中x
是寄存器名称中的VimL),并将其转换为在第三个参数中指定的模式, V
代表linewise,没有代表字符和文字^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'
。 只要您按=
键,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