Incollare il codice nella finestra del terminale in vim su Mac OS X

Quando incollo il codice nella finestra del terminale di Mac OS X in vim, viene indentata ogni riga. Per ogni riga aggiunge un rientro in modo che il testo assomigli a questo …

"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." 

La mia soluzione attuale è che incollo il testo prima nell’editor di testo textmate che mantiene la formattazione corretta. Quindi salvo quel file e lo apro in vim. Quindi io uso vim yank per incollarlo.
C’è un settaggio nel mio .vimrc che potrebbe cambiare questo comportamento? O questo è un problema terminale?

All’interno di vim:

 :set paste 

Metti Vim in modalità Incolla. Questo è utile se vuoi tagliare o copiare del testo da una finestra e incollarlo in Vim. Ciò eviterà effetti inattesi.

A partire da Mac OS X Lion 10.7, Terminal supporta la “modalità bracketing paste”, che consente all’emulatore di terminale di dire al programma collegato al tty quando l’utente incolla il testo, in modo che il programma non lo interpreti come comandi di modifica. I programmi che lo supportano inviano al terminale una sequenza di escape per abilitare questa modalità, in cui il terminale circonda il testo incollato con una coppia di sequenze di escape che identificano l’inizio e la fine.

Per abilitare questo in Vim, inserisci il seguente codice nel tuo file ~ / .vimrc:

 if &term =~ "xterm.*" let &t_ti = &t_ti . "\e[?2004h" let &t_te = "\e[?2004l" . &t_te function! XTermPasteBegin(ret) set pastetoggle=[201~ set paste return a:ret endfunction map  [200~ XTermPasteBegin("i") imap  [200~ XTermPasteBegin("") vmap  [200~ XTermPasteBegin("c") cmap [200~  cmap [201~  endif 

Ciò fa sì che quando Vim commuta il terminale su / dallo schermo alternativo † (t_ti, t_te) abiliti / disabiliti la modalità di bracketing (ESC [? 2004 h, ESC [? 2004 l). Quando riceve la sequenza di escape che indica l’inizio di una pasta (ESC [200 ~), triggers la modalità Incolla (imposta incolla) e, se necessario, passa alla modalità Inserimento (“i”). Quando riceve il marker di fine incollaggio corrispondente (ESC [201 ~) disabilita la modalità Incolla (pastetoggle) e rimane in modalità di inserimento. I comandi di cmap alla riga di comando di Vim di ignorare le sequenze di escape e accettano il testo incollato così com’è.

Si noti che questo abilita solo la modalità Incolla tra parentesi quando il valore $ TERM inizia con “xterm …”; se stai settando $ TERM a qualcos’altro, potresti voler rivedere quel test per includere il tuo valore $ TERM. Oppure, puoi omettere il test del tutto, dal momento che non è strettamente necessario, ma sta solo cercando di fare attenzione a non fare qualcosa che potrebbe essere incompatibile con qualche altro tipo di terminale.

In Terminale, questo funziona con tutti i vari comandi Incolla, nonché con il trascinamento della selezione.

† Il terminale ha una schermata principale e una schermata “alternativa”. Ogni schermata ha il suo contenuto e stato. Il testo nella schermata alternativa non scorre nel registro di scorrimento. Viene in genere utilizzato dai programmi che assumono il controllo dell’intero schermo e vengono quindi definiti programmi “a schermo intero”. Questo include, ad esempio, vim, emacs, less e top.

Oltre alle altre risposte, se vuoi un modo rapido per triggersre la modalità Incolla, aggiungi

 set pastetoggle= 

al tuo .vimrc. Ora puoi triggersre la modalità Incolla premendo F2 (o qualunque tasto tu scelga).

In vim

: set paste

quando vuoi disabilitarlo

: imposta nopaste

Un altro modo per fare ciò, assumendo che abbiate la corretta configurazione degli Appunti di sistema, è farlo

 "+p 

Questo verrà incollato dagli Appunti di sistema.

Quando si lavora all’interno di un terminale, il plug -in vim con bracketing con vim bracketing gestirà automaticamente le paste senza bisogno di alcuna sequenza di tasti prima o dopo l’incolla.

Funziona con Terminal, iTerm2 e qualsiasi terminale “moderno” compatibile con x-term che supporti la modalità di inserimento bracketing. Come bonus aggiuntivo funziona anche per le sessioni di tmux. Lo sto utilizzando con successo con iTerm2 su un Mac che si connette a un server Linux e usa tmux.

Il plugin è fondamentalmente una versione pacchettizzata della funzionalità che @Chris Page ha elencato nella sua risposta .