Come posso mantenere il codice formattato come fonte originale quando li incollo su Vim?


37

Quando copio del codice dalle pagine Web e lo incollo su VIM, trovo che diventi uno stile disordinato come una scala come segue

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Dal momento che ha pasticciato così regolarmente, quindi penso che forse ci sia qualcosa di sbagliato nel mio .vimrcche è come di seguito:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Di solito scrivo Python in VIM e l'aiuto sarebbe apprezzato.


1
Grazie. Questo mi ha infastidito per anni, e non sono mai riuscito a chiederlo a nessuno. +1.
DevSolar,

Risposte:


50

Fallo prima:

:set paste

Quindi dopo:

:set nopaste

Non necessario per gvim; li accende e si spengono automaticamente quando si incolla.
Benjamin Bannier,

qualche idea del perché?
Nathan Fellman,

1
Sto solo provando: Plain Vim è solo a riga di comando e non "conosce" gli Appunti. Prende il "incolla" come sequenza di caratteri di input e applica il rientro automatico. Il gvim sensibile alla GUI potrebbe "sapere" che i dati in arrivo provengono dagli Appunti e quindi disabilitare l'autoindenting allo scopo.
DevSolar,

È corretto. Il terminale considera l'operazione "incolla" come input di caratteri non elaborati.
Ignacio Vazquez-Abrams,

Questo non è semplicemente un problema di VIM: puoi ottenere un effetto simile incollando nel vecchio editor DOS in un prompt dei comandi. Questo programma sembra mancare in Windows 7 a 64 bit - presumibilmente perché è davvero una vecchia app DOS a 16 bit e non valeva la pena di aggiornarla. È in Windows XP, tuttavia, e incollare in questo (1) funziona molto lentamente, agendo sull'input carattere per carattere e (2) crea un vero casino.
Steve314,

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Attiva / disattiva rientro automatico per incollare codice

sfondo

Se si utilizzano i comandi Vim per incollare il testo, non si verifica nulla di inaspettato. Il problema sorge solo quando si incolla da un'altra applicazione e solo quando non si utilizza una versione GUI di Vim. In una versione console o terminale di Vim, non esiste una procedura standard per incollare il testo da un'altra applicazione. Invece, il terminale può emulare l'incollamento inserendo del testo nel buffer della tastiera, quindi Vim pensa che il testo sia stato digitato dall'utente. Al termine di ogni riga, Vim può spostare il cursore in modo che la riga successiva inizi con lo stesso rientro dell'ultima. Tuttavia, ciò cambierà il rientro già nel testo incollato.

Incolla attiva / disattiva

Inserisci quanto segue nel tuo vimrc (cambia in qualunque chiave tu voglia):

set pastetoggle=<F2>

Per incollare da un'altra applicazione:

  • Avvia la modalità di inserimento.
  • Premi F2 (attiva l'opzione 'incolla').
  • Usa il tuo terminale per incollare il testo dagli appunti.
  • Premi F2 (disattiva l'opzione 'incolla').

Quindi verrà trattenuto il rientro esistente del testo incollato.

Non è necessario avviare prima la modalità di inserimento, ma se si è in modalità normale e si dispone di un mapping per F2, tale mapping verrà applicato e la funzione 'pastetoggle' non funzionerà.

Ad alcune persone piace il feedback visivo mostrato nella riga di stato dalla seguente alternativa per il tuo vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

La prima riga imposta una mappatura in modo che premendo F2 in modalità normale si inverta l'opzione 'incolla', e quindi si visualizzi il valore di tale opzione. La seconda riga consente di premere F2 in modalità inserimento, per attivare e disattivare "incolla". La terza riga consente di visualizzare se 'incolla' è attivato in modalità inserimento.


1
+1 per la soluzione di scelta rapida. Per i non troppo fermi in VIM (come me) che hanno già mappato i tasti F su qualcos'altro (come me), <C-F2> sarebbe Ctrl-F2 ...
DevSolar

eccellente - Ora sto usando questo
hoju

perché non solo mappare i tasti incolla per farlo automaticamente, come <Inserisci> o <Ctrl + V>, insieme alle loro funzioni originali? Oppure, scrivi una funzione che disabilita incolla quando più di alcuni caratteri di input vengono scritti nel buffer nel tempo di un secondo, è solo un'idea, ovviamente per me ho quasi TUTTI i miei tasti associati ad altre cose, quindi è una seccatura , Ho anche una tastiera con 12 tasti F e + 15 altri tasti F (tasti G), e con quello, tre livelli, che non è ancora abbastanza :) ma sono solo io. L'unico problema è il menu di scelta rapida, a cui non viene inviato alcun esc seqs per segnalare un'operazione di inizio-incolla ...
osirisgothra,

2

È l'autoindentatore che ti prende in giro.

set autoindent
set smartindent

Prova a disabilitarli quando tagli e incolli il tuo codice, quindi riattivalo quando hai finito.


-2

Lo sforzo più basso per raggiungere questo obiettivo è (può essere messo in .vimrc):

:set paste

Quindi incolla il tuo codice.


3
L' 'paste'opzione non è stata pensata per essere impostata in modo permanente. Disabilita molte cose, tra cui mappature e abbreviazioni. Inoltre, una risposta precedente copre già l' 'paste'opzione.
Eptita,

2
Benvenuto in Super User! Questo duplica una risposta esistente e non aggiunge nuovi contenuti. Per favore, non pubblicare una risposta a meno che tu non abbia effettivamente qualcosa di nuovo da contribuire.
Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.