从Vim插入模式中粘贴后如何退出

4

我可以将控制字符插入到文本中,这样当我在Vim中复制和粘贴时,它会退出插入模式,并在命令模式下执行一些不良操作吗?


抱歉,我以为你想做相反的事情。 - Burhan Khalid
1
你使用哪些按键(或菜单或鼠标操作)来粘贴?你正在使用Windows吗? - cforbish
1
添加了新标签以澄清事情……也就是说,如果我自己正确理解了作者的意思。 :) - mike3996
“粘贴”选项可用于避免一些危险。请查看:help paste - Jon Carter
我改口了。我认为Ingo Karkat在下面给出的答案是我能想到的最好的实际答案。 - Jon Carter
显示剩余2条评论
2个回答

4
短答案似乎是“是的”。 我能够将以下内容放入我的剪贴板中: ``` hello<Escape>:!date<CR> ``` 当我在插入模式下将其粘贴到vim中时,将输入“hello”,然后打开shell并运行“date”命令。
显然,如果我可以在shell中运行日期命令,那么我可以做更多的恶作剧。
要获取剪贴板中的字符串,我打开了vim并键入了以下内容: ``` hello<C-V><Esc>:!date<C-V><Enter> ``` 然后,我必须保存该文件,使用Kate打开它并以那种方式复制内容(从vim复制未保留控制字符)。

在 Mac OS X 上,我发现 MacVim(GUI 版本)允许我复制特殊字符,当我粘贴它们时,它们只是被添加到缓冲区中。只有在将其粘贴到终端窗口中运行的 vim 中时,我才会遇到不安全的行为。 - benjifisher
我也能做到同样的事情,只需在Vim中输入它,使用“0y$”复制,然后在插入模式下粘贴(“<CTRL-R>”)。 - Pandu

3
这取决于环境和使用的Vim命令。图形化GVIM可以区分粘贴和键入的按键,但在终端中,这通常是不可能的。这就是为什么Vim有“paste”和“pastetoggle”选项,来告诉Vim预期的内容。尽管如此,如果字符流包含像<Esc>这样的切换模式的按键,Vim也会这样做。
与其将文本“推”到Vim中,不如使用Vim的put命令“拉”进来:"*p。在这里,像<Esc>这样的特殊字符将被字面插入到缓冲区中;Vim不会在这里切换模式。唯一一个将寄存器内容解释为已键入的Vim命令(因此容易受到模式切换命令的影响)的命令是i_CTRL-R。为了避免这种情况,应该使用其他任何命令变体,例如i_CTRL-R_CTRL-R
总之,将文本“拉”进Vim而不是“推”进去;如果避免使用i_CTRL-R命令(或通过重新映射来使其无效),则是安全的。此外,:registers命令允许您在粘贴之前检查所有内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接