Vim为什么不正确地缩进粘贴的代码?


100

在Vim中,如果我粘贴以下脚本:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

我得到这些奇怪的结果:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

哈希符号(#)和选项卡已经出现。为什么?


31
对于vi.stackexchange.com,这可能是个更好的问题
Eric Renouf

@EricRenouf为什么?(诚​​实的问题)
Qix 2015年

3
@qix我的想法是,这是一个关于vim如何工作的问题,这是* nix上常用的工具,但是* nix并不是使用vim的必要条件
Eric Renouf 2015年

1
@JaredBurrows我肯定希望能做到
埃里克·雷诺夫

1
您如何触发粘贴?用鼠标?
Ben Voigt 2015年

Answers:


122

有两个原因:

要在vim启用自动缩进时进行粘贴,您必须输入以下内容以更改为粘贴模式

:set paste

然后,您可以更改为插入模式并粘贴您的代码。粘贴完成后,键入:

:set nopaste

关闭粘贴模式。由于这是常见且频繁的操作,因此vim提供了切换粘贴模式:

set pastetoggle=<F2>

您可以更改F2为所需的键,现在可以轻松打开和关闭粘贴。


要关闭自动插入注释,可以将以下行添加到vimrc中

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vim还提供了一个粘贴寄存器,供您粘贴系统剪贴板中的文本。您可以使用"*p"+p取决于您的系统。在没有X11的系统(例如OSX或Windows)上,必须使用*寄存器。在X11系统(如Linux)上,您可以同时使用两者。

进一步阅读


2
我一直在使用Vim,却从不知道。非常感谢。
Caja 2015年

大多数现代的图形终端仿真器都支持一种称为“包围式粘贴模式”的功能。Vim可以要求终端启用此模式,然后该模式将用某些转义序列包围粘贴的文本。Vim可以识别出这种情况,并在粘贴期间关闭环绕/缩进。长话短说:粘贴将“按预期工作”。我不是vim用户,但是快速的网络搜索一定会告诉您如何配置此模式。
egmont

2
@MichaelDurrant set paste永远不会出现在您的vimrc中。它禁用或重置了很多东西,包括插入模式映射,命令行映射,缩写,文本宽度,wrapmargin,自动缩进,smartindent,softtabstop,formatoptions,indentexpr等。:h paste有整个清单。大多数人会使用其中的某些或全部内容,并且想知道为什么忽略了这些设置。
FDinoff

4
我通常:r!cat习惯逐字粘贴。
西蒙·里希特

1
可能值得讨论与的交互set mouse,当单击鼠标进行粘贴时,可以自动进入和退出粘贴模式。
Ben Voigt 2015年

36

使用vim粘贴。您想要的是粘贴剪贴板缓冲区中的内容 "+p

这将选择+并将其粘贴到位。

如果您使用的是Linux,*则是X /中键单击缓冲区(最后选择的文本)。

然后vim知道这是粘贴。

否则,vim会认为您已经键入了要粘贴的键,并且在粘贴结束之前一直执行自己的自动缩进(在复制的缩进之上)。

作为通过SSH进行操作的说明,您需要设置剪贴板共享选项 -Y

请参阅man ssh以获取更多详细信息。


4
这实际上是正确的答案,恕我直言
Kristoffer Sall-Storgaard

看起来这仅适用于图形vim(gvim);在终端仿真器中运行的vim
会将

我不使用gvim,仅使用终端vim。您的鼠标设置是什么?我的鼠标设置是c。不确定允许鼠标选择时它如何工作。set mouse?
exussum 2015年

2
还检查vim --versionse,看看是否在剪贴板支持下进行了编译+xterm_clipboard
exussum

@wurtel:也许您已将unnamed字符串设置为剪贴板。
cuonglm

8

插入选项卡是因为您已启用自动缩进功能,并且可以:set noai在粘贴到终端之前通过关闭自动缩进()来禁用该行为。

注释行是通过自动注释生成的,可以通过将其关闭来禁用。

替代那些方法,您应该使用切换按钮:set paste,粘贴格式化的代码并:set nopaste恢复正常行为,从而获得所需的 行为。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.