我正在努力学习Vim。

当我从剪贴板将代码粘贴到文档中时,每一行的开头都会有额外的空格:

line
  line
    line

我知道你可以关闭自动缩进,但我无法让它工作,因为我有一些其他设置冲突或其他问题(在我的.vimrc中看起来很明显,但当我删除它们时似乎无关紧要)。

如何在粘贴代码时关闭自动缩进,但在编写代码时仍然有vim自动缩进?这是我的.vimrc文件:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  

当前回答

我直到现在才看到另一个答案:

:se paste noai

其他回答

将此添加到~/.vimrc中,您只需在粘贴前后按F2即可:

set pastetoggle=<F2>

虽然使用paste/nopaste/pastetoggle设置粘贴模式非常好,但在粘贴之前仍必须手动启用粘贴模式,在粘贴之后禁用粘贴模式。作为一个懒惰的人,下面是我迄今为止找到的最佳解决方案,当你粘贴时,它会自动切换粘贴模式。

这里有一个小技巧,使用终端的括号粘贴模式粘贴时自动设置/取消设置Vim的粘贴模式。放入以下内容在.vimrc中:设&t_SI.=“\<Esc>[?2004h”设&t_EI.=“\<Esc>[?2004l”inoremap<special><expr><Esc>[200~XTermPasteBegin()作用XTermPasteBegin()设置pastetoggle=<Esc>[201~凝固膏return“”端函数现在,您可以在不显式打开/关闭粘贴模式的情况下进行粘贴-这是自动为您处理。

来源:Coderwall

注意:此解决方案不适用于WSL(Windows 10 Subsystem for Linux)。如果任何人有WSL的解决方案,请更新此答案或将其添加到评论中。

如果使用Tmux,则需要对声明进行双转义。代码也在Coderwall中

来自vim:]p

从外部:“*]p或”+]p

更新:更好的答案在这里:https://stackoverflow.com/a/38258720/62202

要在粘贴代码时关闭自动缩进,有一种特殊的“粘贴”模式。

类型

:set paste

然后粘贴代码。注意,工具提示中的文本现在显示--INSERT(粘贴)--。

粘贴代码后,请关闭粘贴模式,以便键入时自动缩进再次正常工作。

:set nopaste

然而,我总是觉得这很麻烦。这就是为什么我映射<F3>,这样它可以在编辑文本时在粘贴和非粘贴模式之间切换!我将此添加到.vimrc

set pastetoggle=<F3>

不幸的是,我发现上面提到的vim插件不适用于iTerm2 3.0.15(公平地说,我不知道这是否在旧版本上发生了)-但我发现了这个黑客。

使用iTerm2 vim键映射命令-p以进行粘贴。显然,这只适用于iTerm2。

它的工作原理。我使用“jk”进入逃生模式,因此您还需要:

:inoremap jk

在你的.virc中。

然后它只调用P进入粘贴模式,“+P从剪贴板粘贴,然后P禁用粘贴模式。