Tmux 1.7 新增的 bracketed paste mode 支援,可以讓 Vim 分辨現在是 tmux 貼上而不是手動打字。
引用 Bracketed Paste Mode | dodaの日記 | スラッシュドット・ジャパン(稍有修改):
" Ref http://slashdot.jp/journal/506765/Bracketed-Paste-Mode " - Use tmux 1.7 `paste-buffer -p` to paste " - Use <F11> and tmux `send-keys "\e[201~"` for pastetoggle if &term =~ "xterm" && exists('$TMUX') let &t_ti = &t_ti . "\e[?2004h" let &t_te = "\e[?2004l" . &t_te let &pastetoggle = "\e[201~" map <F11> <Esc>[201~ imap <F11> <Esc>[201~ function! XTermPasteBegin(ret) set paste return a:ret endfunction map <special> <expr> <Esc>[200~ XTermPasteBegin("i") imap <special> <expr> <Esc>[200~ XTermPasteBegin("") cmap <special> <Esc>[200~ <nop> cmap <special> <Esc>[201~ <nop> endif
\e[?2004h
、\e[?2004l
是啟用括弧貼上模式的控制碼,即
XTerm Control Sequences 中的
P s = 2 0 0 4 → Set bracketed paste mode
和
P s = 2 0 0 4 → Reset bracketed paste mode
。
Tmux 1.7 的 paste-buffer
指令新增了 -p
選項,會在貼上文字前加 ESC[200~
、後加 ESC[201~
控制碼。
(參考 SF.net SVN: tmux:[2712] trunk)
利用這兩個控制碼設定 mapping,就能自動調整 'paste' 的狀態了。
不過這個 pastetoggle
會把原本的設定蓋掉,變得無法一鍵切換 'paste'。
將就方案是在 tmux 設定,例如我原本是用 <F11>,就加上 bind F11 send-keys "\e[201~"
。