2011-04-07 145 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