我想将拉出的文本粘贴到Vim的命令行中。有可能吗?
是的。点击Ctrl-R,然后点击”。如果您有文字控制字符,请使用Ctrl-R、Ctrl-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。您在vim中使用的最后一个命令将粘贴到您的缓冲区中。 让我们分解一下:"是一个正常模式命令,允许您选择下一次yank、删除或粘贴操作要使用的寄存器。所以”:选择冒号寄存器(存储最后一个命令)。然后p是一个你已经知道的命令,它粘贴寄存器的内容。
参见:help ",:help quote_:
:help "
:help quote_:
您正在编辑一个VimL文件(例如您的.vimrc),现在想执行几个连续的行:yj:@”输入。 在这里,yj将当前行和下一行(这是因为j是线性运动,但这超出了本答案的范围)拉入默认寄存器(也称为未命名寄存器)。然后:@ Ex命令播放作为参数存储在寄存器中的Ex命令,"就是您引用未命名寄存器的方式。另请参阅此答案的顶部,这是相关的。
.vimrc
:@
不要将此处使用的"(这是一个寄存器名称)与上一个示例中的"混淆,后者是一个正常模式命令。
参见:help :@和:help quote_quote
:help :@
:help quote_quote
使用Ctrl-R,///kbd>在插入模式下将最后一个搜索模式插入文件或命令行。
参见:help quote_/,help i_CTRL-R
:help quote_/
help i_CTRL-R
推论:保留您的搜索模式,但添加一个替代方案:/Ctrl-R,///kbd>\|alternative。
\|alternative
您在可视化模式下选择了一行中间的两个单词,用y猛拉它们,它们在未命名的寄存器中。现在您想在您所在位置的正下方打开一行,使用这两个词::pu。这是:put "的简写。:put命令,像许多Ex命令一样,只能按行工作。
:pu
:put "
:put
参见:help :put
:help :put
您也可以这样做::call setreg('"', @", 'V')然后p。setreg函数设置名称作为第一个参数(作为字符串)的寄存器,使用第二个参数的内容初始化它(您可以将寄存器用作名称为@x的变量,其中x是VimL中的寄存器名称),并将其转换为第三个参数中指定的模式,V用于线性,没有用于字符,文字^V用于块。
:call setreg('"', @", 'V')
p
setreg
@x
x
V
^V
参考。:help setreg()。反向函数是getreg()和getregtype()。
:help setreg()
getreg()
getregtype()
如果你用qa…q记录了一个宏,那么:echo @a会告诉你你键入了什么,@a会重播宏(可能你知道那个,为了避免重复任务非常有用)
qa
q
:echo @a
@a
参见:help q,help @
:help q
help @
从上例推论:如果剪贴板中有8go,那么@+会将剪贴板内容作为宏播放,从而转到文件的第8个字节。实际上,这几乎适用于所有寄存器。如果您最后插入的字符串是插入模式下的dd,那么@.将(因为.寄存器包含最后插入的字符串)删除一行。(Vim留档在这方面是错误的,因为它指出寄存器#、%、:和.仅适用于p、@+0、@+1和@+2-@+3)。
8go
@+
dd
@.
.
%
参见:help @
:help @
不要混淆:@(从寄存器播放Vim命令的命令)和@(从寄存器播放正常模式命令的正常模式命令)。
@
值得注意的例外是@:。命令寄存器不包含初始冒号,也不包含最终回车。但是在正常模式下,@:会执行您期望的操作,将寄存器解释为Ex命令,而不是尝试在正常模式下播放它。因此,如果您的最后一个命令是:e,则寄存器包含e,但@:将重新加载文件,而不是转到单词末尾。
@:
:e
e
参见:help @:
:help @:
在运行之前显示您将在正常模式下执行的操作:@='dd'输入。一旦您点击=键,Vim就会切换到表达式求值:当您输入表达式并点击输入时,Vim会对其进行计算,结果将充当寄存器内容。当然寄存器=是只读的,并且是一次性的。每次您开始使用它时,您都必须输入一个新表达式。
@='dd'
=
参见:help quote_=
:help quote_=
推论:如果您正在编辑命令,并且您意识到您应该需要在命令行中插入当前缓冲区中的一些行:不要按Esc!使用Ctrl-R=getline(58)输入。之后您将返回命令行编辑,但它插入了第58行的内容。
=getline(58)
手动定义搜索模式::let @/ = 'foo'
:let @/ = 'foo'
参见:help :let
:help :let
请注意,这样做,您不必在模式中转义/。但是,您当然需要将所有单引号加倍。
复制所有以foo开头的行,然后将所有包含bar的行复制到剪贴板,链接这些命令:qaq(重置一个寄存器,其中存储一个空宏),:g/^foo/y A,:g/bar/y A,:let @+ = @a。
foo
bar
qaq
:g/^foo/y A
:g/bar/y A
:let @+ = @a
使用资本寄存器名称使寄存器工作在追加模式
更好的是,如果Q没有被mswin.vim重新映射,则使用Q启动Ex模式,链接那些实际上更好地称为“Ex命令”的“冒号命令”,并通过键入visual返回正常模式。
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的同义词(参见:help :range)。由于:put将文本放在该行之后,因此您必须明确告诉它对前一行采取行动。
:g/^/-put ='foo'
.-1
:help :range
将整个缓冲区复制到系统剪贴板::%y+。
:%y+
参见:help :range(用于%部分)和:help :y。
如果您错误记录了宏,您可以键入:let @a='Ctrl-R=replace(@a,"'","''",'g')输入'并对其进行编辑。这将修改存储在寄存器a中的宏的内容,这里显示了如何使用表达式寄存器来做到这一点。另一种更简单的修改宏的方法是将其粘贴到缓冲区("ap)中,编辑它,然后通过选择它和"ay再次将其放入寄存器中。
:let @a='
=replace(@a,"'","''",'g')
'
"ap
"ay
如果您执行了dddd,您可能会执行uu以撤消。使用p,您可以获得最后删除的行。但实际上,您还可以使用寄存器@1到@9恢复多达9个删除。
dddd
uu
@1
@9
更好的是,如果您执行"1P,则正常模式下的.将播放"2P,依此类推。
"1P
"2P
参见:help .和:help quote_number
:help .
:help quote_number
如果要在插入模式下插入当前日期:Ctrl-R=strftime('%y%m%d')输入。
=strftime('%y%m%d')
参见:help strftime()
:help strftime()
再一次,什么可能令人困惑:
:@是一个命令行命令,它将寄存器的内容解释为vimcript并将其来源
@在正常模式下的命令,将寄存器的内容解释为正常模式击键(除非您使用:寄存器,它包含没有初始冒号的最后播放命令:在这种情况下,它重播命令,就好像您还重新键入冒号和最终返回键一样)。
"在正常模式下命令,可帮助您选择一个寄存器,用于Yank、粘贴、删除、更正等。
"也是一个有效的寄存器名称(默认或未命名的寄存器),因此可以作为期望寄存器名称的命令的参数传递
要粘贴系统剪贴板,您可以使用SHIFT-INS。
它适用于Windows,但我猜它也适用于Linux。
要将系统剪贴板中的内容粘贴到Vim命令行(“命令模式”),请使用Ctrl+R后跟+。对我来说,至少在Ubuntu上,Shift+ins不起作用。
PS:我不知道为什么Ctrl+R后跟*,理论上与Ctrl+R后跟+相同似乎并不总是有效。我搜索并发现了+版本,它似乎总是有效,至少在我的盒子上。
还值得注意的是,yank寄存器与宏缓冲区相同。换句话说,您可以简单地在文档中写出整个命令(包括粘贴的片段),然后"by将其yank到b寄存器,然后使用@b运行它。
"by
b
@b
"我想将拉出的文本粘贴到Vim命令行中。"
虽然投票最多的答案非常完整,但我更喜欢编辑命令历史记录。
在正常模式下,键入:q:。这将为您提供最近命令的列表,可使用普通vim命令编辑和搜索。您将从底部的空白命令行开始。
q:
对于文章所问的确切问题,将一个被拉行(或任何东西)粘贴到命令行中,拉你的文本,然后:q:p(进入命令历史编辑模式,然后(p)将被拉行的文本放入新的命令行。随意编辑,输入执行。
q:p
要退出命令历史记录模式,则相反。在命令历史记录的正常模式下,键入::q+输入
:q
我遇到了类似的问题。我希望选定的文本以命令结束,但不依赖于粘贴它。这是我试图为其编写映射的命令:
:call VimuxRunCommand("python")
此插件的文档仅使用字符串文字显示。如果您尝试选择包含双引号的文本,以下内容将中断:
vnoremap y:call VimuxRunCommand("<c-r>"")<cr>
要解决这个问题,您只需使用@引用宏的内容:
vnoremap y:call VimuxRunCommand(@")<cr>
将未命名寄存器的内容传入并使用我的双引号和多行边缘字符。
osx
如果您在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
~/.vimrc
set clipboard=unnamed
现在您可以使用yy在Vim中复制该行并将其粘贴到系统范围内。
yy
对于上下文,此信息来自开箱即用,没有插件,没有. vimrc Vim 7.4行为LinuxMint中的默认选项。
您始终可以使用鼠标选择文本(或使用V或v并将所选内容放在“*寄存器中),并使用Shift+Ctrl+v将其粘贴到命令行中。
在命令行中键入Ctrl+r将导致寄存器名称的提示。因此键入: CTRL-r*将把内容寄存器*放入命令行。它将粘贴任何寄存器,而不仅仅是“*。请参阅:help c_CTRL-R。
:help c_CTRL-R
此外,鼠标中键将粘贴到命令行中。
有关X Window如何处理选择的描述,请参阅:help->quote-plus。即使在普通的开箱即用的Vim中(无论如何,在LinuxMint的Vim 7.4中),使用鼠标左键进行的任何选择都可以使用鼠标中键粘贴到命令行中。
:help->quote-plus
此外,鼠标中键还将在Vim中选择的文本粘贴到许多其他X Window应用程序中,甚至是GUI应用程序(例如,Firefox和雷鸟),并且还可以将文本粘贴到命令行中,其中文本是从其他应用程序中选择的。
有关addl信息,请参阅:help->x11选择。
tl; dr
首先尝试:CTRL-r方法,然后使用Shift+Ctrl+v或鼠标中键,如果您需要其他东西。
人们承认,这可能会令人困惑。
"[a-z]y:将文本复制到[a-z]寄存器
"[a-z]y
使用:!转到编辑命令
:!
Ctrl+R:按照寄存器标识粘贴您复制的内容。
使用CentOS 7。
如果您将两个值拉入两个不同的寄存器(例如寄存器a和寄存器b),那么您可以简单地设置变量c并对其进行操作。
例如,:set c = str2float(@a) + str2float(@b),然后您可以将c的内容粘贴到任何地方。
:set c = str2float(@a) + str2float(@b)
例如,在INSERT模式下,CTRL + R然后键入=进入表达式寄存器,只需在等号后键入c并按ENTER。完成后,您现在应该拥有a和b寄存器的总数。
CTRL + R
所有这些都可以记录在一个宏中并重复!
如果您使用浮点数,则使用str2float函数,如果不使用,则将获得整数。
str2float
我不确定这是否惯用,但它适用于我需要连续添加2个数字并重复500行的情况。
我喜欢使用Control-v从系统剪贴板粘贴,所以我使用:
cnoremap <C-v> <C-r>+