我想将抽取的文本粘贴到Vim命令行中 . 可能吗?
是 . 按Ctrl-R然后“ . 如果您在已拉动的内容中有文字控制字符,请使用Ctrl-R,Ctrl-O,” .
以下是对可以使用寄存器执行的操作的说明 . 你可以用寄存器做什么是非凡的,一旦你知道如何使用它们就不能没有它们 .
寄存器基本上是字符串的存储位置 . Vim有许多寄存器以不同的方式工作:
0 (yank寄存器:当你在正常模式下使用 y 时,没有指定寄存器,被拉出的文本也会到达默认寄存器),
0
y
1 至 9 (移位删除寄存器,当您使用 c 或 d 等命令时,已删除的内容转到寄存器1,寄存器1中的内容转到寄存器2等),
1
9
c
d
" (默认寄存器,也称为未命名寄存器 . 这是“来自Ctrl-R”,),
"
a 至 z 供您自己使用(大写 A 至 Z 用于附加到相应的寄存器) .
a
z
A
Z
_ (类似于 /dev/null (Unix)或 NUL (Windows),您可以写入但它被丢弃,当您从中读取时,它始终为空),
_
/dev/null
NUL
- (小删除寄存器),
-
/ (搜索模式寄存器,例如,当您查找带有 / , ? , * 或_895674的文本时更新;您也可以写入它以动态更改搜索模式),
/
?
*
: (通过 Q 或 : ,readonly存储最后一个VimL类型命令),
:
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
但是您也可以执行以下操作(我可能忘记了寄存器的许多用途) .
比照 :help " , :help quote_:
:help "
:help quote_:
.vimrc
:@
不要将此处使用的 " (这是一个寄存器名称)与上一个示例中的 " 混淆,后者是一个普通模式命令 .
比照 :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,没有用于按字符和字面 ^V 为blockwise .
:call setreg('"', @", 'V')
p
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
比照 :help @
:help @
不要混淆 :@ (从寄存器播放Vim命令的命令)和 @ (从寄存器播放正常模式命令的普通模式命令) .
@
值得注意的例外是 @: . 命令寄存器不包含初始冒号,也不包含最终的回车符 . 但是在正常模式下, @: 将执行您所期望的操作,将寄存器解释为Ex命令,而不是尝试在正常模式下播放 . 因此,如果您的上一个命令是 :e ,则寄存器包含 e 但 @: 将重新加载文件,而不是结束字 .
@:
:e
e
比照 :help @:
:help @:
@='dd'
=
比照 :help quote_=
:help quote_=
推论:如果您正在编辑命令,并且您意识到您需要在命令行中插入当前缓冲区中的某些行:不要按Esc!使用Ctrl-R =getline(58) Enter . 之后,您将返回命令行编辑,但它已插入第58行的内容 .
=getline(58)
:let @/ = 'foo'
比照 :help :let
:help :let
请注意,这样做,您无需在模式中转义 / . 但是,当然你需要将所有单引号加倍 .
foo
bar
qaq
:g/^foo/y A
:g/bar/y A
:let @+ = @a
使用大写寄存器名称使寄存器在附加模式下工作
更好的是,如果没有 mswin.vim 重新映射 Q ,则使用 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 (cf. :help :range )的同义词 . 由于 :put 将文本放在行之后,因此必须明确告诉它对前一行进行操作 .
:g/^/-put ='foo'
.-1
:help :range
将整个缓冲区复制到系统剪贴板: :%y+ .
:%y+
比照 :help :range (对于 % 部分)和 :help :y .
如果您错误地记录了一个宏,可以输入 :let @a=' Ctrl-R =replace(@a,"'","''",'g') 输入 ' 并进行编辑 . 这将修改存储在寄存器 a 中的宏的内容,这里显示了如何使用表达式寄存器来执行此操作 .
:let @a='
=replace(@a,"'","''",'g')
'
如果您执行 dddd ,则可以执行 uu 以撤消 . 使用 p ,您可以获得最后删除的行 . 但实际上,您还可以使用寄存器 @1 至 @9 恢复最多9次删除 .
dddd
uu
@1
@9
更好的是,如果你做 "1P ,那么 . 在普通模式下将播放 "2P ,依此类推 .
"1P
"2P
比照 :help . 和 :help quote_number
:help .
:help quote_number
=strftime('%y%m%d')
比照 :help strftime()
:help strftime()
再一次,可能令人困惑的是:
:@ 是一个命令行命令,它将寄存器的内容解释为vimscript并将其获取
@ 在正常模式命令中将寄存器的内容解释为正常模式击键(除非使用 : 寄存器,其中包含上次播放的命令而没有初始冒号:在这种情况下,它会重放命令,就像您还重新输入一样冒号和最终返回键) .
" 在普通模式命令中帮助您选择一个用于猛拉,粘贴,删除,更正等的寄存器 .
" 也是有效的寄存器名称(默认或未命名的寄存器),因此可以作为期望寄存器名称的命令的参数传递
对于粘贴系统剪贴板的东西,你可以使用SHIFT - INS .
它适用于Windows,但我猜它在Linux中运行良好 .
“我想将抽取的文本粘贴到Vim命令行中 . ”
虽然最高投票的答案非常完整,但我更喜欢编辑命令历史 .
在正常模式下,键入: q: . 这将为您提供最近的命令列表,可以使用普通的vim命令进行编辑和搜索 . 您将从底部的空白命令行开始 .
q:
对于文章要求的确切事情,将一条猛拉线(或任何东西猛拉)粘贴到命令行中,将文本拉出来然后: q:p (进入命令历史编辑模式,然后(p)将您的拉出文本转换为新文本命令行 . 随意编辑,输入执行 .
q:p
要退出命令历史记录模式,情况正好相反 . 在命令历史记录的正常模式下,键入: :q enter
:q
值得注意的是,yank寄存器与宏缓冲区相同 . 换句话说,您可以简单地在文档中写出整个命令(包括粘贴的代码段),然后 "by 将其拖到 b 寄存器中,然后使用 @b 运行它 .
"by
b
@b
要将系统剪贴板中的内容粘贴到vim命令行("command mode"),请使用Ctrl R,然后按 . 对我来说,至少在Ubuntu上,Shift Ins无效 .
PS:不确定为什么Ctrl R后跟*,理论上与Ctrl R相同后跟似乎总是不起作用 . 我搜索并发现了它的版本,它似乎总是起作用,至少在我的盒子上 .
我遇到了类似的问题 . 我希望所选文本最终出现在命令中,但不要依赖于粘贴它 . 这是我试图为以下内容编写映射的命令:
:call VimuxRunCommand("python")
此插件的文档仅显示使用字符串文字 . 如果您尝试选择包含双引号的文本,以下内容将会中断:
vnoremap y:call VimuxRunCommand("<c-r>"")<cr>
要解决这个问题,您只需使用 @ 引用宏的内容:
vnoremap y:call VimuxRunCommand(@")<cr>
传递未命名寄存器的内容,并使用我的双引号和多行边框 .
OSX
如果你在MAC OSX中使用vim,不幸的是它配备了较旧版本,并且没有符合剪贴板选项 . 幸运的是,自制软件可以轻松解决这个问题 .
安装vim:
brew install vim --with-lua --with-override-system-vi
安装vim的gui:
brew install macvim --with-lua --with-override-system-vi
重启终端才能生效 .
将以下行追加到 ~/.vimrcset clipboard=unnamed
~/.vimrc
set clipboard=unnamed
现在你可以用 yy 复制vim中的行并在系统范围内粘贴它 .
yy
这个问题已经很老了,但是因为它被观看了很多次,所以它似乎很受欢迎 - 我会把这个放在后代 . 对于上下文,这个信息来自开箱即用,没有插件,没有.vimrc vim 7.4在linux mint中的行为与默认选项 .
您始终可以使用鼠标选择文本(或使用V或v并将选择放在“*寄存器”中),然后使用SHIFT-CTL-v将其粘贴到命令行中 .
在命令行中键入CTL-r将导致提示注册名称 . 所以输入:CTL-r 会将内容寄存器放入命令行 . 它将粘贴任何寄存器,而不仅仅是“* . 请参阅:help c_CTRL-R .
此外,鼠标中键将粘贴到命令行中 . 请参阅:help-> quote-plus,了解x11如何处理选择 . 即使在一个简单的,开箱即用的vim中(再次,在linux mint中的vim 7.4中),使用鼠标左键进行的任何选择都可以使用鼠标中键粘贴在命令行中 .
此外,鼠标中键还会将在vim中选择的文本粘贴到许多其他x11应用程序中,即使是gui文件(例如,firefox,thunderbird),也可以将文本粘贴到命令行,其中文本是从其他应用程序中选择的 .
请参阅:help-> x11-add for addl info .
tl;dr
首先尝试:CTL-r方法,然后使用SHIFT-CTL-v或鼠标中键,如果你需要别的东西 .
我们承认它可能令人困惑 .
"[a-z]y 将文本复制到[a-z]寄存器;
"[a-z]y
使用 :! 转到编辑命令;
:!
CTRL+R 按照注册标识粘贴您复制的内容 .
CTRL+R
它曾经用于CentOS7 .
9 回答
是 . 按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),您可以写入但它被丢弃,当您从中读取时,它始终为空),-
(小删除寄存器),/
(搜索模式寄存器,例如,当您查找带有/
,?
,*
或_895674的文本时更新;您也可以写入它以动态更改搜索模式),:
(通过Q
或:
,readonly存储最后一个VimL类型命令),+
和*
(系统剪贴板寄存器,您可以写入它们来设置剪贴板并从中读取剪贴板内容)有关完整参考,请参见
:help registers
.您可以随时使用
:registers
显示所有寄存器的内容 . 此命令的同义词和缩写是:display
,:reg
和:di
.在插入或命令行模式下,Ctrl-R加上寄存器名称,插入该寄存器的内容 . 如果你想按字面插入它们(没有自动缩进,没有控制字符转换为
0x08
到退格等),你可以使用Ctrl-R,Ctrl-O,寄存器名称 . 有关更多参考,请参阅:help i_CTRL-R
和以下段落 .但是您也可以执行以下操作(我可能忘记了寄存器的许多用途) .
让我们分解:
"
是一个普通模式命令,它允许您选择在下一次抽取,删除或粘贴操作期间使用的寄存器 . 所以“:选择冒号寄存器(存储最后一个命令) . 然后p是你已经知道的命令,它粘贴寄存器的内容 .比照
:help "
,:help quote_:
.vimrc
)并且想立即执行几个连续的行:yj:@“Enter .在这里,yj将当前和下一行(这是因为j是行向运动,但这超出了这个答案的范围)到默认寄存器(也称为未命名寄存器)中 . 然后
:@
Ex命令播放存储在作为参数给出的寄存器中的Ex命令,"
是您引用未命名寄存器的方式 . 另请参阅此答案的顶部,这是相关的 .不要将此处使用的
"
(这是一个寄存器名称)与上一个示例中的"
混淆,后者是一个普通模式命令 .比照
:help :@
和:help quote_quote
比照
:help quote_/
,help i_CTRL-R
推论:保留搜索模式,但添加替代方案:
/
Ctrl-R,/\|alternative
.y
猛拉它们,它们位于未命名的寄存器中 . 现在,您想要在您所在的位置下方打开一个新行,并使用这两个词::pu
. 这是:put "
的简写 . 与许多Ex命令一样,:put
命令仅适用于行 .比照
: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'
Enter . 只要按下=
键,Vim就会切换到表达式评估:当您输入表达式并按Enter键时,Vim会对其进行计算,结果将作为寄存器内容 . 当然寄存器=
是只读的,一次性的 . 每次开始使用它时,都必须输入新的表达式 .比照
: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
.使用大写寄存器名称使寄存器在附加模式下工作
更好的是,如果没有
mswin.vim
重新映射Q
,则使用Q
启动Ex模式,链接那些实际上更好地称为“Ex命令”的“冒号命令”,并通过键入visual
返回正常模式 .比照
:help :g
,:help :y
,:help Q
双倍空间文件:
:g/^/put _
. 这使得黑洞寄存器的内容(在读取时为空,但可写,行为类似于/dev/null
)在每行之后(因为每行都有一个开头!) .在每行之前添加包含
foo
的行::g/^/-put ='foo'
. 这是表达式寄存器的巧妙使用 . 这里,-
是.-1
(cf.:help :range
)的同义词 . 由于: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
=strftime('%y%m%d')
Enter .比照
:help strftime()
再一次,可能令人困惑的是:
:@
是一个命令行命令,它将寄存器的内容解释为vimscript并将其获取@
在正常模式命令中将寄存器的内容解释为正常模式击键(除非使用:
寄存器,其中包含上次播放的命令而没有初始冒号:在这种情况下,它会重放命令,就像您还重新输入一样冒号和最终返回键) ."
在普通模式命令中帮助您选择一个用于猛拉,粘贴,删除,更正等的寄存器 ."
也是有效的寄存器名称(默认或未命名的寄存器),因此可以作为期望寄存器名称的命令的参数传递对于粘贴系统剪贴板的东西,你可以使用SHIFT - INS .
它适用于Windows,但我猜它在Linux中运行良好 .
“我想将抽取的文本粘贴到Vim命令行中 . ”
虽然最高投票的答案非常完整,但我更喜欢编辑命令历史 .
在正常模式下,键入:
q:
. 这将为您提供最近的命令列表,可以使用普通的vim命令进行编辑和搜索 . 您将从底部的空白命令行开始 .对于文章要求的确切事情,将一条猛拉线(或任何东西猛拉)粘贴到命令行中,将文本拉出来然后:
q:p
(进入命令历史编辑模式,然后(p)将您的拉出文本转换为新文本命令行 . 随意编辑,输入执行 .要退出命令历史记录模式,情况正好相反 . 在命令历史记录的正常模式下,键入:
:q
enter值得注意的是,yank寄存器与宏缓冲区相同 . 换句话说,您可以简单地在文档中写出整个命令(包括粘贴的代码段),然后
"by
将其拖到b
寄存器中,然后使用@b
运行它 .要将系统剪贴板中的内容粘贴到vim命令行("command mode"),请使用Ctrl R,然后按 . 对我来说,至少在Ubuntu上,Shift Ins无效 .
PS:不确定为什么Ctrl R后跟*,理论上与Ctrl R相同后跟似乎总是不起作用 . 我搜索并发现了它的版本,它似乎总是起作用,至少在我的盒子上 .
我遇到了类似的问题 . 我希望所选文本最终出现在命令中,但不要依赖于粘贴它 . 这是我试图为以下内容编写映射的命令:
此插件的文档仅显示使用字符串文字 . 如果您尝试选择包含双引号的文本,以下内容将会中断:
要解决这个问题,您只需使用
@
引用宏的内容:传递未命名寄存器的内容,并使用我的双引号和多行边框 .
OSX
如果你在MAC OSX中使用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
现在你可以用
yy
复制vim中的行并在系统范围内粘贴它 .这个问题已经很老了,但是因为它被观看了很多次,所以它似乎很受欢迎 - 我会把这个放在后代 . 对于上下文,这个信息来自开箱即用,没有插件,没有.vimrc vim 7.4在linux mint中的行为与默认选项 .
您始终可以使用鼠标选择文本(或使用V或v并将选择放在“*寄存器”中),然后使用SHIFT-CTL-v将其粘贴到命令行中 .
在命令行中键入CTL-r将导致提示注册名称 . 所以输入:CTL-r 会将内容寄存器放入命令行 . 它将粘贴任何寄存器,而不仅仅是“* . 请参阅:help c_CTRL-R .
此外,鼠标中键将粘贴到命令行中 . 请参阅:help-> quote-plus,了解x11如何处理选择 . 即使在一个简单的,开箱即用的vim中(再次,在linux mint中的vim 7.4中),使用鼠标左键进行的任何选择都可以使用鼠标中键粘贴在命令行中 .
此外,鼠标中键还会将在vim中选择的文本粘贴到许多其他x11应用程序中,即使是gui文件(例如,firefox,thunderbird),也可以将文本粘贴到命令行,其中文本是从其他应用程序中选择的 .
请参阅:help-> x11-add for addl info .
tl;dr
首先尝试:CTL-r方法,然后使用SHIFT-CTL-v或鼠标中键,如果你需要别的东西 .
我们承认它可能令人困惑 .
"[a-z]y
将文本复制到[a-z]寄存器;使用
:!
转到编辑命令;CTRL+R
按照注册标识粘贴您复制的内容 .它曾经用于CentOS7 .