将文本粘贴到 Vim 中时关闭自动缩进

我正在努力学习 Vim。

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

line
  line
    line

我知道您可以关闭自动缩进,但是由于其他一些设置有冲突或其他原因(在我的. vimrc 中看起来很明显,但是取出它们似乎并不重要),我无法使其正常工作。

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

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

答案

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

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

类型

:set paste

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

粘贴代码后,请关闭粘贴模式,以使键入时的自动缩进可以再次正常使用。

:set nopaste

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

set pastetoggle=<F3>

为避免粘贴时出现不良效果,需要设置一个选项:

set paste

在. vimrc 中有用的命令是set pastetoggle=<F10>或其他按钮,以方便地在粘贴和 nopaste 之间切换。

我通常使用:r! cat ,然后粘贴( shift + insert )内容,然后按CTRL+D

无需启用和禁用,直接使用。

如果您在本地工作,则可以使用以下按键序列从系统剪贴板粘贴:

"+p

这是一个正确的 vim 命令,因此无需担心进入插入模式或先关闭自动缩进功能。

当然,如果您正在远程工作(例如,通过 SSH 进行控制台),则此方法将不起作用,您应该按照其他地方的说明使用:set noai ,插入模式,粘贴到控制台,保留 insertmode 和:set ai路由。

虽然使用paste/nopaste/pastetoggle设置粘贴模式非常好,但是您仍必须在粘贴之前手动启用粘贴模式,并在粘贴之后禁用粘贴模式。作为我的懒人,以下是到目前为止我发现的最佳解决方案,它可以在粘贴时自动切换粘贴模式。

这是一个小技巧,可在粘贴时使用终端的方括号粘贴模式自动设置 / 取消 Vim 的粘贴模式。在您的. vimrc 文件中添加以下内容:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

现在,您可以粘贴而无需显式打开 / 关闭粘贴模式 - 它会自动为您处理。

资料来源: Coderwall

注意:此解决方案在 WSL(Linux 的 Windows 10 子系统)中不起作用。如果有人对 WSL 有解决方案,请更新此答案或将其添加到注释中。

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

Mac 用户可以通过直接从粘贴板读取以下内容来避免自动格式化:

:r !pbpaste

这是某人的帖子 ,他弄清楚了如何重新映射粘贴事件以自动打开然后关闭粘贴模式。在 MacOSX 上的 tmux / iTerm 中为我工作。

将其添加到~/.vimrc ,只需在粘贴前后按F2键:

set pastetoggle=<F2>

我只是在我的. vimrc 文件中放置了set clipboard=unnamed 。这使得默认的粘贴缓冲区映射到 X 的剪贴板。

因此,如果我在终端中标记了一些文本,则只需按p即可将其粘贴到 vim 中。同样,我可以在 vim 中拉动东西(例如,将当前行拉到YY ),然后在任何窗口中单击鼠标中键将其粘贴。

不知道。我觉得这很方便。

在终端中操作时, vim 括号粘贴的 vim 插件将自动处理粘贴,而无需在粘贴之前或之后进行任何击键。

它通过检测带括号的粘贴模式来工作,该模式是 “现代” x 术语兼容终端(如 iTerm2,gnome-terminal 和其他使用 libvte 的终端)发送的转义序列。作为额外的好处,它也适用于 tmux 会话。我在连接到 Linux 服务器并使用 tmux 的 Mac 上与 iTerm2 一起成功使用了它。