2011-04-07 172 views
61

当我将代码粘贴到我的Mac OS X终端窗口中时,它将缩进每行。对于每一个这样的文字看起来像这样它添加一个缩进线...将代码粘贴到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中是否有可以改变这种行为的设置?或者这是一个终端问题?

回答

78

在VIM:

:set paste 

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

+0

太棒了,谢谢! – 2011-04-07 17:48:25

+0

我把它放在一个切换;即;我有这个在我的vimrc ... 设置pastetoggle = wom 2014-07-09 19:59:28

+0

为了理智的缘故,谢谢 – chrismarx 2016-03-04 21:38:25

6

在VIM

:设置粘贴

当你想禁用它

:nopaste

+2

或':设置粘贴!'来切换它。 – 2014-07-11 13:39:37

+0

感谢您也包括如何关闭它。 3年后..... – 2014-12-15 04:26:29

9

设置除了其他的答案, 如果你 希望快速切换粘贴模式,添加

set pastetoggle=<F2> 

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

+0

我也设置了pastetoggle到但通过F2调用函数来实现。 这是因为在粘贴模式下,我还希望vim取消“showbreak”的设置,以便我可以从编辑器窗口清除副本。 – anthony 2017-05-11 02:10:14

+0

注意:我也很好地使用了“listchars”(使用set“list”切换),所以当不使用粘贴模式时,我可以在行尾看到不间断的空格,制表符和额外的空格。这通常是隐藏的字符给我很多greif,并且listchars让我知道他们是他们的。还有一些其他隐藏的Unicode空格字符VIM不'显示'。 – anthony 2017-05-11 02:10:33

97

从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。

+2

你还应该为命令模式添加一个映射(用冒号输入)。否则,你失去粘贴到命令行的能力: 'CMAP [200〜'' CMAP [201〜' – raimue 2011-09-09 09:12:03

+3

本所现iTerm2支持:http://iterm2.googlecode.com/svn/ trunk/appcasts/testing_changes.html – Matt 2011-09-13 20:56:34

+0

感谢@Raim,我添加了'cmap'命令。 – 2011-09-25 08:05:43

5

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

"+p 

这将从系统剪贴板粘贴。

+2

'“* p'或'”+ p'。 '*'寄存器是X11的主选择,'+'是剪贴板。我不知道Mac OS X是否与X11具有相同的概念。 – 2014-07-11 13:37:58

4

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

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

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

+0

Vim-8具有内置功能,但如果您在命令模式下尝试并过去,也会进行插入粘贴。那就是你不能再粘贴vim命令了!我已经做了超过30年(从'vi'和'elvis'的日子) – anthony 2017-05-11 02:15:49