在Mac OS X上将代码粘贴到终端窗口中的vim中

时间:2011-04-07 17:30:22

标签: macos vim text terminal

当我将代码粘贴到我的Mac OS X终端窗口到vim时,它会缩进每一行。对于每一行,它都会添加一个缩进,因此文本看起来像这样......

"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中是否有可能改变此行为的设置?或者这是一个终端问题?

6 个答案:

答案 0 :(得分:105)

更新:Vim 8包括对Bracketed Paste Mode 的原生支持。它默认启用。请参阅Vim的xterm-bracketed-paste帮助主题。用户不再需要做任何事情来配置Vim来支持它。

从Mac OS X Lion 10.7开始,终端支持“括号粘贴模式”,它允许终端模拟器在用户粘贴文本时告诉连接到tty的程序,以便程序不会将其解释为编辑命令。支持它的程序向终端发送一个转义序列以启用此模式,其中终端用一对标识开始和结束的转义序列围绕粘贴的文本。

要在Vim中启用此功能,请将以下代码放在〜/ .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将终端切换到备用屏幕†(t_ti,t_te)时,它启用/禁用括号粘贴模式(ESC [?2004 h,ESC [?2004 l])。当它收到指示粘贴开始的转义序列(ESC [200~)时,它启用粘贴模式(设置粘贴)并在必要时切换到插入模式(“i”)。当它收到匹配的粘贴结束标记(ESC [201~)时,它会禁用粘贴模式(pastetoggle)并保持在插入模式。 cmap命令安排Vim命令行忽略转义序列并按原样接受粘贴的文本。

请注意,当$ TERM值以“xterm ...”开头时,这仅启用括号粘贴模式;如果您将$ TERM设置为其他内容,则可能需要修改该测试以包含您的$ TERM值。或者,您可以完全省略测试,因为它不是绝对必要的 - 它只是要小心不要做一些可能与其他终端类型不兼容的事情。

在终端中,这适用于所有各种粘贴命令,以及拖放。

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

答案 1 :(得分:84)

在vim中:

:set paste
  

将Vim置于粘贴模式。如果要剪切或复制,这非常有用           一个窗口中的一些文本并将其粘贴到Vim中。这样可以避免           意想不到的影响。

答案 2 :(得分:9)

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

set pastetoggle=<F2>

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

答案 3 :(得分:6)

在vim

  

:设置粘贴

当你想要禁用它时

  

:设置nopaste

答案 4 :(得分:6)

另一种方法是,假设你正确设置了系统剪贴板,那就是

"+p

这将从系统剪贴板中粘贴。

答案 5 :(得分:4)

在终端内部工作时,vim-bracketed-paste vim插件会自动处理粘贴,而无需在粘贴之前或之后进行任何击键。

这适用于终端,iTerm2以及任何支持括号粘贴模式的“现代”x-term兼容终端。作为额外奖励,它也适用于tmux会话。我在连接Linux服务器并使用tmux的Mac上成功使用iTerm2。

该插件基本上是@Chris Page在其answer中列出的功能的打包版本。