我想将抽出的文本粘贴到 Vim 的命令行中。可能吗?
是的。打Ctrl-R然后"。如果您在拉出的内容中有文字控制字符,请使用Ctrl- R, Ctrl- O, ".
Ctrl
R
"
O
这是对寄存器可以做什么的解释。你可以用寄存器做的事情是非凡的,一旦你知道如何使用它们,你就离不开它们。
寄存器基本上是字符串的存储位置。Vim 有许多以不同方式工作的寄存器:
0
y
1
9
c
d
a
z
A
Z
_
/dev/null
NUL
-
/
?``*``#
:``Q
:
+
*
请参阅:help registers完整参考。
:help registers
您可以随时使用:registers显示所有寄存器的内容。此命令的同义词和简写是:display,:reg和:di.
:registers
:display
:reg
:di
在插入或命令行模式下,Ctrl-R加上一个寄存器名称,插入该寄存器的内容。如果您想按字面意思插入它们(不自动缩进,不将控制字符转换0x08为退格等),您可以使用Ctrl- R, Ctrl- O, 寄存器名称。请参阅:help i_CTRL-R以下段落以获取更多参考。
0x08
:help i_CTRL-R
但是您也可以执行以下操作(我可能忘记了寄存器的许多用途)。
"``:``p
"``:
p
参看。:help ",:help quote_:
:help "
:help quote_:
.vimrc
y``j``:``@``"``Enter
y``j
:@
不要将"此处使用的(它是一个寄存器名称)与"上一个示例中的(普通模式命令)混淆。
参看。:help :@和:help quote_quote
:help :@
:help quote_quote
参看。:help quote_/,help i_CTRL-R
:help quote_/
help i_CTRL-R
推论:保留您的搜索模式,但添加一个替代方案:/ Ctrl- R, / \|alternative.
\|alternative
:pu
:put "
:put
参看。:help :put
:help :put
你也可以这样做::call setreg('"', @", 'V')然后p. 该setreg函数设置名称作为第一个参数(作为字符串)给出的寄存器,用第二个参数的内容对其进行初始化(您可以将寄存器用作变量,@x其中x名称是 VimL 中的寄存器名称),并且将其转换为第三个参数中指定的模式,V对于 linewise,对于 characterwise 和 literal^V对于 blockwise。
:call setreg('"', @", 'V')
setreg
@x
x
V
^V
参看。:help setreg(). 反函数是getreg()和getregtype()。
:help setreg()
getreg()
getregtype()
qa
q
:echo @a
@a
参看。:help q,help @
:help q
help @
上一个示例的推论:如果您8go在剪贴板中,则将@+剪贴板内容作为宏播放,从而转到文件的第 8 个字节。实际上,这几乎适用于每个寄存器。如果您最后插入的字符串dd处于插入模式,那么@.将(因为.寄存器包含最后插入的字符串)删除一行。(Vim 文档在这方面是错误的,因为它指出寄存器#、%和只能与、 和-:一起使用)。.``p``P``:put``Ctrl``R
8go
@+
dd
@.
.
#
%
.``p``P``:put``Ctrl``R
参看。:help @
:help @
不要混淆:@(从寄存器播放 Vim 命令的命令)和@(从寄存器播放正常模式命令的正常模式命令)。
@
值得注意的例外是@:。命令寄存器不包含初始冒号,也不包含最后的回车。但是在正常模式下,@:会做你所期望的,将寄存器解释为 Ex 命令,而不是尝试在正常模式下播放它。因此,如果您的最后一条命令是:e,则寄存器包含e但@:会重新加载文件,而不是转到字尾。
@:
:e
e
参看。:help @:
:help @:
@='dd'
Enter
=
参看。:help quote_=
:help quote_=
推论:如果你正在编辑一个命令,并且你意识到你应该从你的当前缓冲区中插入一些行到你的命令行:不要按Esc!使用Ctrl- R =getline(58) Enter。之后您将返回命令行编辑,但它已插入第 58 行的内容。
Esc
=getline(58)
:let @/ = 'foo'
参看。:help :let
:help :let
请注意,这样做,您无需/在模式中转义。但是,您当然需要将所有单引号加倍。
foo
bar
qaq
:g/^foo/y A
:g/bar/y A``:let @+ = @a
使用大写寄存器名称使寄存器在附加模式下工作
更好的是,如果Q没有被 重新映射mswin.vim,则使用 启动 Ex 模式Q,链接那些实际上更好称为“淓x 命令”的“淓命令”,然后键入 回到正常模式visual。
Q
mswin.vim
visual
参看。:help :g, :help :y,:help Q
:help :g
:help :y
:help Q
双倍空间你的文件::g/^/put _。这将黑洞寄存器的内容(读取时为空,但可写,行为类似/dev/null)逐行放置在每一行之后(因为每一行都有一个开头!)。
:g/^/put _
在每行之前添加foo一行::g/^/-put ='foo'. 这是对表达式寄存器的巧妙使用。这里,-是.-1(cf. :help :range) 的同义词。由于:put将文本放在行之后,因此您必须明确告诉它对前一个进行操作。
:g/^/-put ='foo'
.-1
:help :range
将整个缓冲区复制到系统剪贴板::%y+.
:%y+
参看。:help :range(对于%部分)和:help :y。
如果您误录了宏,您可以键入:let @a=' Ctrl-R =replace(@a,"'","''",'g') Enter '并对其进行编辑。这将修改存储在寄存器中的宏的内容,a这里展示了如何使用表达式寄存器来做到这一点。
:let @a='
=replace(@a,"'","''",'g')
'
如果你这样做了dddd,你可能会这样做uu以撤消。有了p你可以获得最后删除的行。但实际上您也可以@1通过@9.
dddd
uu
@1
@9
更好的是,如果你这样做了"1P,那么.在普通模式下会播放"2P,等等。
"1P
"2P
参看。:help .和:help quote_number
:help .
:help quote_number
R``=strftime('%y%m%d')``Enter
参看。:help strftime()
:help strftime()
再一次,什么可能令人困惑:
@ in normal mode 命令将寄存器的内容解释为正常模式的击键(除非您使用:寄存器,它包含最后播放的命令,不带初始冒号:在这种情况下,它会重播命令,就好像您还重新键入了冒号和最后的返回键)。
" 在正常模式下命令,它可以帮助您选择一个用于 yank、paste、delete、更正等的寄存器。
" 也是一个有效的寄存器名称(默认或未命名的寄存器),因此可以作为期望寄存器名称的命令的参数传递