Perché il rientro di Vim incolla il codice in modo errato?


101

In Vim, se incollo questo script:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Ottengo questi strani risultati:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Sono apparsi segni di hash (#) e schede. Perché?


31
Questa potrebbe essere una domanda migliore per vi.stackexchange.com
— Eric Renouf,

@EricRenouf perché? (domanda onesta)
— Qix,

3
@qix il mio pensiero era che questa è una domanda su come funziona vim, che è uno strumento comune da usare su * nix, ma * nix non è un requisito per l'utilizzo di vim
— Eric Renouf,

1
@JaredBurrows Spero davvero che ce la faccia
— Eric Renouf,

1
Come stai innescando la pasta? Con il mouse?
— Ben Voigt,

Risposte:


123

Ci sono due ragioni:

Per incollare vimmentre il rientro automatico è abilitato, è necessario passare alla modalità incolla digitando:

:set paste

Quindi puoi cambiare per inserire la modalità e incollare il tuo codice. Dopo aver incollato, digita:

:set nopaste

per disattivare la modalità incolla. Poiché questa è un'azione comune e frequente, vimoffre la modalità incolla attiva:

set pastetoggle=<F2>

Puoi passare F2a qualsiasi chiave tu voglia, e ora puoi attivare e disattivare facilmente l'incollamento.


Per disattivare l'inserimento automatico dei commenti, puoi aggiungere queste righe al tuo vimrc :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimfornisce anche un registro di incollaggio per incollare il testo dagli Appunti di sistema. È possibile utilizzare "*po in "+pbase al proprio sistema. Su un sistema senza X11, come OSX o Windows, è necessario utilizzare il *registro. Su un sistema X11, come Linux, puoi usare entrambi.

Ulteriori letture


2
Uso Vim da sempre e non l'ho mai saputo. Grazie molto.
— Caja,

La maggior parte degli emulatori di terminali grafici moderni supporta una funzione chiamata "modalità incolla parentesi". Vim può chiedere al terminale di abilitare questa modalità, che a sua volta circonderà il testo incollato con determinate sequenze di escape. Vim può riconoscerlo e disattivare il wrapping / rientro per la durata della pasta. Lunga storia: incollare "funzionerà come previsto". Non sono un utente VIM, ma una rapida ricerca web ti dirà sicuramente come configurare questa modalità.
— egmont,

2
@MichaelDurrant set pastenon dovrebbe mai essere nel tuo vimrc. Disabilita o reimposta molte cose, tra cui mappature della modalità di inserimento, mappature della riga di comando, abbreviazioni, larghezza del testo, avvolgimento, autoindent, smartindent, softtabstop, formatoptions, indentexpr e un paio di altre. :h pasteha l'intero elenco. Molte persone usano alcune o tutte queste cose e si chiedono perché le impostazioni vengano ignorate.
— FDinoff,

4
Di solito uso :r!catper incollare alla lettera.
— Simon Richter,

1
Potrebbe valere la pena discutere dell'interazione con set mouse, che può entrare e uscire automaticamente dalla modalità incolla quando si incolla con il clic del mouse.
— Ben Voigt,

36

Usa la pasta vim. Quello che vuoi è incollare ciò che è nel buffer degli appunti "+p

Questo seleziona +e lo incolla sul posto.

Se stai usando Linux, *è il buffer X / clic centrale (l'ultimo testo selezionato).

Quindi vim sa che è una pasta.

Altrimenti vim pensa di aver digitato le chiavi incollate e fa il suo rientro automatico (sopra il rientro copiato) fino alla fine della copia.

Come nota perché questo funzioni su SSH è necessario impostare l'opzione per la condivisione degli Appunti -Y

Vedi man sshper maggiori dettagli.


4
Questa è in realtà la risposta corretta imho
— Kristoffer Sall-Storgaard,

Sembra che funzioni solo per il grafico vim ( gvim); vim in esecuzione in un emulatore di terminale incolla l'ultimo testo eliminato con "* p, non la selezione corrente.
— wurtel

Non uso gvim, solo il terminale vim. qual è l'impostazione del mouse? la mia impostazione del mouse è c. Non sono sicuro di come funzioni quando è consentita la selezione del mouse. set mouse?
— exussum,

2
controlla anche vim --versionse vedi se è stato compilato con il supporto degli appunti +xterm_clipboarddovrebbe essere nell'output
— exussum

@wurtel: forse hai impostato gli appunti con una unnamedstringa.
— cuonglm,

8

Le schede sono state inserite perché Autoindent è attivato e puoi disabilitare quel comportamento disattivando autoindent ( :set noai) prima di incollarlo nel terminale.

Le righe commentate sono prodotte dai commenti automatici e possono essere disabilitate disattivandolo.

In alternativa a quelli, dovresti ottenere il comportamento desiderato usando gli interruttori :set paste, incollando il tuo codice formattato e :set nopasteper ripristinare il comportamento normale.

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.