【发布时间】:2011-04-29 03:58:26
【问题描述】:
我想将抽出的文本粘贴到 Vim 的命令行中。有可能吗?
【问题讨论】:
-
对于直接执行被拉出的文本的特殊情况,请参阅:How do you run a vim command that is the text inside a buffer? - Super User。
标签: vim copy-paste
我想将抽出的文本粘贴到 Vim 的命令行中。有可能吗?
【问题讨论】:
标签: vim copy-paste
是的。点击 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 中使用的最后一个命令将粘贴到您的缓冲区中。
让我们分解一下:" 是一个普通模式命令,可让您选择在下一次 yank、delete 或 paste 操作期间要使用的寄存器。所以 ": 选择冒号寄存器(存储最后一个命令)。然后 p 是一个你已经知道的命令,它粘贴寄存器的内容.
参见。 :help ",:help quote_:
您正在编辑一个 VimL 文件(例如您的 .vimrc)并且现在想要执行几个连续的行:yj :@"输入。
在这里, 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,nothing 用于字符和文字 ^V 用于块。
参见。 :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(重置 a 寄存器,其中存储了一个空宏), :g/^foo/y A, :g/bar/y A, :let @+ = @a.
使用大写寄存器名称使寄存器工作在附加模式
更好的是,如果Q 没有被mswin.vim 重新映射,则使用Q 启动Ex 模式,链接那些实际上更好称为“Ex commands”的“冒号命令”,然后通过键入返回到Normal 模式visual.
参见。 :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') Enter '并编辑它。这将修改存储在寄存器a 中的宏的内容,这里展示了如何使用表达式寄存器来执行此操作。
如果您执行了dddd,您可以执行uu 以撤消。使用p,您可以获得最后删除的行。但实际上您也可以使用寄存器@1 到@9 恢复多达 9 次删除。
更好的是,如果你播放"1P,那么普通模式下的. 会播放"2P,以此类推。
参见。 :help . 和 :help quote_number
如果要在插入模式下插入当前日期:Ctrl-R=strftime('%y%m%d')Enter。
参见。 :help strftime()
再一次,有什么可能令人困惑:
:@ 是一个命令行命令,它将寄存器的内容解释为 vimscript 并获取它@ in normal mode 命令将寄存器的内容解释为正常模式击键(除非您使用 : 寄存器,它包含最后播放的命令,但不带初始冒号:在这种情况下,它会重播该命令就像您还重新键入了冒号和最后的返回键一样)。
" 正常模式下的命令,可帮助您选择用于拉取、粘贴、删除、更正等操作的寄存器。
" 也是一个有效的寄存器名称(默认或未命名的寄存器),因此可以作为需要寄存器名称的命令的参数传递【讨论】:
要粘贴系统剪贴板内容,您只需使用 SHIFT - INS。
它适用于 Windows,但我猜它也适用于 Linux。
【讨论】:
:!rm -rf /<cr>,它将执行该操作。改用寄存器!
shift-ins 比ctrl-R+* 更容易吗?当然,如果你在 gvim 中。如果您在连接到另一台机器的终端中并且想从剪贴板粘贴一些内容,您是否知道比shift-ins 更好的内容?因为寄存器在这种情况下不起作用。在您发表评论和做其他事情(例如投票)之前,请三思。
“我想将抽出的文本粘贴到 Vim 命令行中。”
虽然票数最高的答案非常完整,但我更喜欢编辑命令历史记录。
在正常模式下,输入:q:。这将为您提供最近的命令列表,可使用普通 vim 命令进行编辑和搜索。您将从底部的空白命令行开始。
对于文章所要求的确切内容,将拉出的行(或拉出的任何内容)粘贴到命令行中,拉出您的文本,然后:q:p(进入命令历史编辑模式,然后 (p)ut 您的将文本拉到新的命令行中。随意编辑,回车执行。
要退出命令历史模式,则相反。在命令历史记录中的正常模式下,键入::q + enter
【讨论】:
要将系统剪贴板中的内容粘贴到 Vim 命令行(“命令模式”),请使用 Ctrl+R 后跟 + .对我来说,至少在 Ubuntu 上,Shift+Ins 不起作用。
PS:不知道为什么Ctrl+R后面跟着*,理论上和Ctrl是一样的kbd>+R 后跟 + 似乎并不总是有效。我搜索并发现了 + 版本,它似乎总是有效,至少在我的盒子上。
【讨论】:
还值得注意的是,抽出寄存器与宏缓冲区相同。换句话说,你可以简单地在你的文档中写出你的整个命令(包括你粘贴的 sn-p),然后"by 将它拉到b 寄存器,然后用@b 运行它。
【讨论】:
我遇到了类似的问题。我希望所选文本以命令结尾,但不依赖于粘贴。这是我试图为其编写映射的命令:
:call VimuxRunCommand("python")
此插件的文档仅显示使用字符串文字。如果您尝试选择包含双引号的文本,以下内容将中断:
vnoremap y:call VimuxRunCommand("<c-r>"")<cr>
要解决这个问题,您只需使用 @ 引用宏的内容即可:
vnoremap y:call VimuxRunCommand(@")<cr>
将未命名寄存器的内容传入并使用我的双引号和多行边缘情况。
【讨论】:
@ 字符发送到vimux 命令。将@ 视为转义以下双引号并将其视为寄存器而不是常规字符。我定义的vnoremap 在可视模式下处于活动状态,因此它会拉出选定的文本,然后将其粘贴到 vimux 命令中,将其发送到相邻窗格中正在运行的解释器。非常适合编写脚本并通过几次击键来测试其中的一小部分。
就上下文而言,此信息来自具有默认选项的 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),也可以将文本粘贴到命令行中的文本是从其他应用中选择的。
查看 :help->x11-selection 了解 addl 信息。
tl;dr
首先尝试 :CTRL-r 方法,然后如果需要,请使用 Shift + Ctrl + v 或鼠标中键否则。
承认这可能会令人困惑。
【讨论】:
OS X
如果您在 Mac OS X 中使用 Vim,很遗憾它带有旧版本,并且不符合剪贴板选项。幸运的是,Homebrew 可以轻松解决这个问题。
安装 Vim:
brew install vim --with-lua --with-override-system-vi
安装 GUI 版本的 Vim:
brew install macvim --with-lua --with-override-system-vi
重启终端使其生效。
将以下行追加到~/.vimrc
set clipboard=unnamed
现在您可以在 Vim 中使用 yy 复制该行并将其粘贴到系统范围内。
【讨论】:
"[a-z]y:将文本复制到 [a-z] 寄存器
使用:!进入编辑命令
Ctrl + R:按照注册标识粘贴复制的内容。
它曾经用于 CentOS 7。
【讨论】:
如果您有两个值被拉入两个不同的寄存器(例如寄存器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 中编辑并从那里复制。
【讨论】:
vim编辑器里,我只是好奇,你能右键粘贴吗?
right-click