^ M alla fine di ogni riga in vim


132

Quando sto modificando i file sorgente usando vim e altri editor a volte alla fine della riga ottengo questi ^ M caratteri alla fine di ogni riga. Penso che abbia qualcosa a che fare con la modifica di un file in Windows e poi in Linux. Come posso rimuovere tutti questi automaticamente?


18
È perché Windows utilizza una sequenza di due caratteri (normalmente scritta "\ r \ n") per rappresentare un'interruzione di riga, ma UNIX / Linux utilizza solo il secondo carattere "\ n" per rappresentare un'interruzione di riga. Quindi, quando modifichi un file di testo di Windows su un editor Linux, l'editor vede caratteri extra che non considera parte delle interruzioni di riga, quindi cerca di renderli e ciò che ne risulta è ^ M.
David Z,

13
C'è un po 'di più, David. Vim modificherà felicemente un file di testo con terminazioni di riga DOS senza mostrare tutte quelle ^Ms. L'unica indicazione che hai durante la modifica di un file di testo DOS in Vim è se hai %{&ff}nel statuslinevalore dell'opzione. Vim mostra ^Mquando lo stile di fine linea è misto . Significa che hai usato un editor di testo che non è esperto come Vim, che non ha seguito lo stile di fine linea esistente, come Vim per impostazione predefinita. Se usi Vim o qualcos'altro del suo calibro su Windows, non otterrai terminazioni di linea rovinate in questo modo.
Warren Young,

Risposte:


128

Come comando, digitare

:%s/^M$//

(Per ottenere ^ M, premi ^ V ^ M, dove ^ è CTRL sulla maggior parte delle tastiere)


62
inoltre:% s / \ r $ // per evitare la seccatura ^ V ^ M
glenn jackman,

8
Oppure, salvando un personaggio::%s/\r$
vedi il

2
@sehe salva tecnicamente 2 caratteri :)
Chris

@glennjackman, il tuo consiglio è stato molto più semplice, dato che stavo faticando a ottenere il ^ V + ^ M se non stesse succedendo affatto. Tutto quello che stavo ottenendo era il contenuto negli Appunti (poiché ^ V era efficace ogni volta, nonostante i miei ripetuti tentativi con strategie diverse per ottenerli entrambi).
itsraghz,

86

Un modo semplice per eliminare le terminazioni di riga DOS è utilizzare l' ffopzione:

:set ff=unix
:wq

Ora il tuo file è tornato alla vecchia maniera Unix.

Se vuoi aggiungere i finali di riga DOS (per rendere felice una stampante o trasferire file con amici di Windows che non hanno strumenti utili) puoi andare facilmente nella direzione opposta:

:set ff=dos
:wq

8
vim non ha trovato alcun ^ m, o \ r, o nessuna delle altre terminazioni di linea, ma ha funzionato. Grazie :)
SgtPooki,

2
Vim non avrebbe trovato alcun ^ M o \ r, ma questo ha funzionato per me! Grazie @sarnold
ottobre

sembrerebbe che Git sia troppo stupido per rilevarlo come un singolo cambio di carattere. Ho eseguito questo in Vim e gli git diffspettacoli hanno cancellato ogni riga e ogni riga aggiunta: /
Tommy,

Tommy, questa è una limitazione diff, non una git.
Spidey,

34

Puoi farlo:

:set fileformats=dos

Nasconderà quello ^M, senza toccare il file.


17

C'è un programma chiamato dos2unix che dovrebbe eliminare quelli per te. Windows utilizza diversi caratteri di fine riga, motivo per cui ciò accade.


6

Questo ha funzionato per me in un file che conteneva tutto su una riga:

Per prima cosa trova tutte le partite

:%s/^M//

(Per ottenere ^M, premere ^ V ^ M, dove ^ si trova Ctrlsulla maggior parte delle tastiere)

Quindi sostituire con le nuove righe

:%s//\r/g

Il comando combinato sarebbe:

:%s/^M/\r/g

Grazie, mi chiedevo come inserire effettivamente Ctrl-M in cerca-sostituisci!
Roboprog,


1

L'origine del problema potrebbe essere stata attraverso un trasferimento FTP. Quando si FTP questi file da una casella all'altra, assicurarsi di utilizzare i trasferimenti ASCII. Utilizzare il comando "ASC".


0
" put this in your ~/.vimrc file and :source ~/.vimrc
" then you can do: Dos2Unix
" dos2unix ^M
fun! Dos2unixFunction()
    let _s=@/
    let l = line(".")
    let c = col(".")
    try
        set ff=unix
        w!
        "%s/\%x0d$//e
    catch /E32:/
        echo "Sorry, first save the file."
    endtry
    let @/=_s
    call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

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.