在Mac OS X上将代码粘贴到vim中

当我将代码粘贴到我的Mac OS Xterminal窗口中时,它缩进每行。 对于每一行它添加一个缩进,所以文本看起来像这样…

"ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 

我目前的解决方法是我粘贴文本首先进入textmate文本编辑器,保持正确的格式。 然后我保存该文件并在vim中打开它。 然后我用vim把它粘贴起来。
有没有在我的.vimrc可以改变这种行为的设置? 或者这是一个terminal问题?

在vim中:

 :set paste 

将Vim置于粘贴模式。 如果您想从一个窗口中剪切或复制一些文本并粘贴到Vim中,这非常有用。 这将避免意想不到的效果。

从Mac OS X Lion 10.7开始,terminal支持“括号内粘贴模式”,使terminal仿真程序能够在用户粘贴文本时告诉连接到tty的程序,以便程序不会将其解释为编辑命令。 支持它的程序向terminal发送一个转义序列来启用这个模式,在这种模式下,terminal用一对标识开始和结束的转义序列来包围粘贴的文本。

为了在Vim中启用这个function,把下面的代码放到〜/ .vimrc文件中:

 if &term =~ "xterm.*" let &t_ti = &t_ti . "\e[?2004h" let &t_te = "\e[?2004l" . &t_te function XTermPasteBegin(ret) set pastetoggle=<Esc>[201~ set paste return a:ret endfunction map <expr> <Esc>[200~ XTermPasteBegin("i") imap <expr> <Esc>[200~ XTermPasteBegin("") vmap <expr> <Esc>[200~ XTermPasteBegin("c") cmap <Esc>[200~ <nop> cmap <Esc>[201~ <nop> endif 

这样,当Vim将terminal切换到备用屏幕†(t_ti,t_te)时,它启用/禁用括号粘贴模式(ESC [?2004 h,ESC [?2004 l))。 当它接收到指示粘贴开始的转义序列(ESC [200〜))时,它将启用粘贴模式(设置粘贴)并在必要时切换到插入模式(“i”)。 当它接收到匹配的粘贴结束标记(ESC [201〜))时,将禁用粘贴模式(pastetoggle)并保持插入模式。 cmap命令安排Vim命令行忽略转义序列并按原样接受粘贴的文本。

请注意,当$ TERM值以“xterm …”开头时,这只能启用括号内的粘贴模式; 如果您将$ TERM设置为其他值,则可能需要修改该testing以包含您的$ TERM值。 或者,你完全可以省略这个testing,因为这不是必须的 – 只是要小心不要做一些可能与其他terminaltypes不兼容的事情。

在terminal中,这可以与所有各种粘贴命令以及拖放操作一起使用。

†terminal有一个主屏幕和一个“备用”屏幕。 每个屏幕都有自己的内容和状态。 备用屏幕中的文本不会滚动到回滚日志中。 它通常被接pipe整个屏幕的程序所使用,因此被称为“全屏”程序。 这包括vim,emacs,less和top,例如。

除了其他答案之外,如果您想快速切换粘贴模式,请添加

 set pastetoggle=<F2> 

到您的.vimrc。 现在,您可以通过按F2(或您select的任何键)切换粘贴模式。

在vim中

:设置粘贴

当你想禁用它

:设置nopaste

另一种方法来做到这一点,假设你的系统剪贴板设置正确的做

 "+p 

这将从系统剪贴板粘贴。

在terminal内部工作时, vim-bracketed-paste vim插件将自动处理粘贴,而不需要在粘贴之前或之后进行任何按键操作。

这在terminal,iTerm2以及支持括号粘贴模式的任何“现代”x-term兼容terminal都可以使用。 作为额外的好处,它也适用于三合一会议。 我正在使用iTerm2在Mac上连接到Linux服务器并使用tmux成功使用它。

该插件基本上是@Chris Page的答案中列出的function的打包版本。