Define automaticamente o modo de colagem no Vim ao colar no modo de inserção

Quando você deseja colar algo no terminal (não-gui) Vim, geralmente deseja executar o seguinte comando antes de colar:

set paste

E depois de colar:

set nopaste

Isso evita que o Vim indente automaticamente o código colado. Algumas pessoas costumam pastetoggletornar isso um pouco mais fácil:

set pastetoggle=<F2>

Agora você pressiona a tecla F2 para alternar a pasta antes e depois de colar.

Aqui está um pequeno truque que usa o modo de colagem entre colchetes do terminal para definir / remover automaticamente o modo de colagem do Vim quando você cola.
Coloque o seguinte em seu .vimrc:

let &t_SI .= "<Esc>[?2004h"
let &t_EI .= "<Esc>[?2004l"

inoremap
<special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction

Agora você pode colar sem ativar / desativar o modo de colar explicitamente – isso é feito automaticamente para você.

Observe que, se você usar o Vim dentro de uma sessão Tmux, será necessário fazer o escape duplo dos códigos em t SI / t EI.
A configuração acima para usuários Tmux se parece com isto:

function! WrapForTmux(s)
if !exists('$TMUX')
return a:s
endif


let tmux_start = "<Esc>Ptmux;"
let tmux_end = "<Esc>\"

return tmux_start . substitute(a:s, "<Esc>", "<Esc><Esc>", 'g') . tmux_end
endfunction


let &t_SI .= WrapForTmux("<Esc>[?2004h")
let &t_EI .= WrapForTmux("<Esc>[?2004l")

function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction


inoremap
<special> <expr> <Esc>[200~ XTermPasteBegin()

Respostas relacionadas:

Comandos básicos do Vim – para começar