![](/img/trans.png)
[英]How to paste the Yanked lines in vim command line after typing other command?
[英]How to paste yanked text into the Vim command line
我想将抽出的文本粘贴到 Vim 的命令行中。 可能吗?
是的。 点击Ctrl - R然后" 。如果您在拉出的内容中有文字控制字符,请使用Ctrl - R , Ctrl - O , " 。
这是对寄存器可以做什么的解释。 你可以用寄存器做的事情是非凡的,一旦你知道如何使用它们,你就离不开它们。
寄存器基本上是字符串的存储位置。 Vim 有许多以不同方式工作的寄存器:
0
(抽出寄存器:当您在正常模式下使用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
)并且现在想执行几个连续的行: y j : @ " Enter 。
在这里, y j将当前行和下一行(这是因为 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,nothing 表示字符和文字^V
表示块。
参看。 :help setreg()
。 反向函数是getreg()
和getregtype()
。
如果你用qa
... q
录制了一个宏,那么:echo @a
@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
(重置a寄存器,其中存储一个空宏), :g/^foo/y A
, :g/bar/y A
, :let @+ = @a
。
使用大写寄存器名称使寄存器在附加模式下工作
更好的是,如果Q
没有被mswin.vim
重新映射,使用Q
启动 Ex 模式,链接那些实际上更好称为“Ex commands”的“冒号命令”,然后通过键入visual
返回 Normal 模式。
参看。 :help :g
, :help :y
, :help Q
双倍空间你的文件: :g/^/put _
。 这会将黑洞寄存器的内容(读取时为空,但可写,行为类似于/dev/null
)逐行放置在每一行之后(因为每一行都有一个开头!)。
在每行之前添加一个包含foo
的行: :g/^/-put ='foo'
。 这是对表达式寄存器的巧妙使用。 在这里, -
是.-1
的同义词(参见:help :range
)。 由于:put
将文本放在该行之后,因此您必须明确告诉它对前一行进行操作。
将整个缓冲区复制到系统剪贴板: :%y+
。
参看。 :help :range
(用于%
部分)和:help :y
。
如果你记错了一个宏,你可以输入:let @a='
Ctrl - R =replace(@a,"'","''",'g')
输入'
并编辑它。 这将修改存储在寄存器a
中的宏的内容,这里展示了如何使用表达式寄存器来执行此操作。 修改宏的另一种更简单的方法是将其粘贴到缓冲区( "ap
)中,对其进行编辑,然后通过选择它和"ay
将其再次放入寄存器中。
如果你做了dddd
,你可能会做uu
以撤消。 使用p
您可以获得最后删除的行。 但实际上,您还可以使用寄存器@1
到@9
恢复多达 9 次删除。
更好的是,如果你播放“ "1P
.
那么在普通模式下会播放"2P
,以此类推。
参看。 :help .
和:help quote_number
如果要在插入模式下插入当前日期: Ctrl - R =strftime('%y%m%d')
Enter 。
参看。 :help strftime()
再一次,什么可能令人困惑:
:@
是一个命令行命令,它将寄存器的内容解释为 vimscript 并获取它
@
在正常模式下将寄存器的内容解释为正常模式击键的命令(除非您使用:
register,它包含没有初始冒号的最后播放的命令:在这种情况下,它会重播命令,就好像您还重新键入了冒号和最后的返回键)。
"
在正常模式下,该命令可帮助您选择用于拉取、粘贴、删除、更正等操作的寄存器。
"
也是一个有效的寄存器名称(默认或未命名的寄存器),因此可以作为需要寄存器名称的命令的参数传递
对于粘贴系统剪贴板的内容,您可以使用SHIFT - INS 。
它适用于 Windows,但我猜它也适用于 Linux。
“我想将抽出的文本粘贴到 Vim 命令行中。”
虽然投票最多的答案非常完整,但我更喜欢编辑命令历史记录。
在正常模式下,键入: q:
。 这将为您提供最近的命令列表,可使用普通 vim 命令进行编辑和搜索。 您将从底部的空白命令行开始。
对于文章所要求的确切内容,将拉出的行(或拉出的任何内容)粘贴到命令行中,拉出您的文本,然后: q:p
(进入命令历史编辑模式,然后(p)将您拉出的文本放入一个新的命令行,随意编辑,回车执行。
要退出命令历史模式,则相反。 在命令历史记录中的正常模式下,键入: :q
+ enter
要将系统剪贴板中的内容粘贴到 Vim 命令行(“命令模式”),请使用Ctrl + R后跟+ 。 对我来说,至少在 Ubuntu 上, Shift + Ins不起作用。
PS:我不确定为什么Ctrl + R后跟* ,理论上与Ctrl + R后跟+相同似乎并不总是有效。 我搜索并发现了+版本,它似乎总是有效,至少在我的盒子上。
值得注意的是,抽出寄存器与宏缓冲区相同。 换句话说,您可以简单地在文档中写出整个命令(包括粘贴的代码段),然后"by
将其拉到b
寄存器,然后使用@b
运行它。
就上下文而言,此信息来自具有默认选项的 Linux Mint 中的开箱即用、无插件、无 .vimrc Vim 7.4 行为。
您始终可以使用鼠标选择文本(或使用V或v并将所选内容放在 "* 寄存器中),然后使用Shift + Ctrl + v将其粘贴到命令行中。
在命令行中键入Ctrl + r将提示输入寄存器名称。 所以键入:CTRL-r*会将内容寄存器 * 放入命令行。 它将粘贴任何寄存器,而不仅仅是“*。请参阅:help c_CTRL-R
。
此外,鼠标中键将粘贴到命令行中。
请参阅:help->quote-plus
以了解 X Window 如何处理选择的描述。 即使在一个普通的、开箱即用的 Vim 中(同样,在 Linux Mint 的 Vim 7.4 中,无论如何),使用鼠标左键所做的任何选择都可以使用鼠标中键粘贴到命令行中。
此外,鼠标中键还将在 Vim 中选择的文本粘贴到许多其他 X Window 应用程序,甚至是 GUI 应用程序(例如,Firefox 和Thunderbird ),并且在从其他应用程序中选择文本的情况下,也可以将文本粘贴到命令行.
有关 addl 信息,请参阅 :help->x11-selection。
tl;博士
首先尝试 :CTRL-r 方法,然后在需要其他内容时使用Shift + Ctrl + v或鼠标中键。
承认它可能会令人困惑。
我遇到了类似的问题。 我希望所选文本以命令结尾,但不依赖于粘贴。这是我试图为其编写映射的命令:
:call VimuxRunCommand("python")
此插件的文档仅显示使用字符串文字。 如果您尝试选择包含双引号的文本,以下内容将中断:
vnoremap y:call VimuxRunCommand("<c-r>"")<cr>
为了解决这个问题,您只需使用@
引用宏的内容:
vnoremap y:call VimuxRunCommand(@")<cr>
将未命名寄存器的内容传入并使用我的双引号和多行边缘情况。
"[az]y
: 将文本复制到 [az] 寄存器
使用:!
转到编辑命令
Ctrl + R :按照注册标识粘贴您复制的内容。
它曾经用于 CentOS 7。
操作系统
如果您在 Mac OS X 中使用 Vim,不幸的是它带有旧版本,并且不符合剪贴板选项。 幸运的是, Homebrew可以轻松解决这个问题。
安装 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
现在您可以在 Vim 中使用yy
复制该行并将其粘贴到系统范围内。
如果您有两个值被拉入两个不同的寄存器(例如寄存器a
和寄存器b
),那么您可以简单地设置一个变量c
并对其进行操作。
例如, :set c = str2float(@a) + str2float(@b)
然后你可以将c
的内容粘贴到任何地方。
例如,在 INSERT 模式下, CTRL + R
然后键入=
进入表达式寄存器,然后在等号后键入c
并按 ENTER。 完成后,您现在应该拥有a
和b
寄存器的总数。
所有这些都可以记录在一个宏中并重复一遍!
如果您使用浮点数,则使用str2float
函数,如果不使用,您将获得整数。
我不确定这是否是惯用的,但它适用于我需要连续添加 2 个数字并重复 500 多行的情况。
我只是right-click
我的鼠标。
打开带有vim fileName
的 vim 文件 按i
进入insert mode
。 然后right-click
鼠标进行粘贴。 我在 VS Code 中编辑并从那里复制。
我喜欢使用 Control-v 从系统剪贴板粘贴,所以我使用:
cnoremap <C-v> <C-r>+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.