首页 文章

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

提问于
浏览
64

当我将代码粘贴到我的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 yank粘贴它 .
我的.vimrc中是否有可能改变此行为的设置?或者这是一个终端问题?

6 回答

  • 4

    UPDATE: Vim 8 includes native support for 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 .

  • 6

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

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

    该插件基本上是@Chris Page在他的_127207中列出的功能的打包版本 .

  • 82

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

    set pastetoggle=<F2>
    

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

  • 9

    另一种方法是假设您正确设置了系统剪贴板

    "+p
    

    这将从系统剪贴板粘贴 .

  • 6

    在vim

    :设置粘贴

    当你想要禁用它

    :设置nopaste

  • 105

    在vim内:

    :set paste
    

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

相关问题