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.