Cosa significa il carattere ^ M in Vim?


500

Continuo a ottenere ^Mcarattere nel mio vimrc e si rompe la mia configurazione.


35
A proposito, questa è una grande risorsa.
Corse di leggerezza in orbita

@LightnessRacesinOrbit - Hm, funziona anche adesso. Ho ritirato il mio commento dicendo che il link era morto.
ArtOfWarfare il

3
Mirror per il link @LightnessRacesinOrbit, che al momento non è attivo
alexpls

4
Digitando :digraphsall'interno di vim viene mostrata la tabella digraph a cui @LightnessRacesinOrbit era collegata.
askewchan,

1
Quando provi a sostituire questo tipo di personaggio usando php, prova questo preg_replace('/[\x01]/', ' ' ,$str); Spero che ti aiuti.
Rachel Geller,

Risposte:


561

Unix utilizza 0xA per un carattere di nuova riga. Windows utilizza una combinazione di due caratteri: 0xD 0xA. 0xD è il carattere di ritorno a capo. ^Msembra essere il modo in cui vim visualizza 0xD (0x0D = 13, M è la 13a lettera dell'alfabeto inglese).

È possibile rimuovere tutti i ^Mcaratteri eseguendo quanto segue:

:%s/^M//g

Dove ^Mviene inserito tenendo premuto Ctrle digitando vseguito da m, quindi rilasciando Ctrl. Questo a volte è abbreviato come ^V^M, ma nota che devi inserirlo come descritto nella frase precedente, piuttosto che digitarlo letteralmente.

Questa espressione sostituirà tutte le occorrenze di ^Mcon la stringa vuota (cioè nulla). Lo uso per sbarazzarmi dei ^Mfile copiati da Windows a Unix (Solaris, Linux, OSX).


9
Nel caso in cui tu sia su Windows, Ctrl + V sarà probabilmente mappato per incollare. In tal caso, le impostazioni predefinite rimappano il tasto "escape caratteri speciali" e lo digitano in Ctrl + Q.
R. Martinho Fernandes,

8
La vera domanda è perché a volte Vim rileva automaticamente le terminazioni di linea e viene visualizzato correttamente, a volte no.
Scott,

10
Vedrai il ^Mcarattere se il file ha terminazioni di riga non corrispondenti. Utilizza il comando fornito da Tomasz, quindi digita in :fileformat={unix|dos|mac}base al sistema operativo di destinazione. Se ci sono solo poche righe senza il ^Mpersonaggio, probabilmente lo desideri :fileformat=dos. Se stai modificando i file in un editor diverso da vim, assicurati che sia configurato in modo che corrisponda alle terminazioni di riga (Notepad non lo farà, ma qualsiasi editor affidabile come Notepad ++ o TextMate lo farà).
Mikkel Paulson,

9
Nota per i principianti vi, quel comando deve essere digitato manualmente. Basta incollarlo in un terminale aperto con in viesecuzione si tradurrà in un errore "modello non trovato".
IQAndreas,

51
@bluesm In realtà dovevo usare :%s/\r//gper sostituire i ritorni a capo nel mio file. Il modello ^ V ^ M non è stato trovato nel file in cui avevo un sacco di personaggi ^ M.
jonnybot

139
:%s/\r//g 

ha lavorato per me oggi. Ma la mia situazione potrebbe essere stata leggermente diversa.


1
l'opzione g non è richiesta, esiste solo una nuova riga per riga. :%s/\r//basterebbe.
frogcoder

7
L'opzione g potrebbe essere molto richiesta, poiché un ritorno a capo non è necessariamente una nuova riga. Quando viene aperto in modalità Unix, il ritorno a capo è solo un altro carattere e quando viene aperto in modalità Windows, il ritorno a capo è speciale solo immediatamente seguito dall'avanzamento di riga.
Jonathan Baldwin,

65

Per tradurre la nuova riga anziché rimuoverla:

:%s/\r/\r/g

2
Cosa dovrebbe effettivamente fare questo? Per me sembra che stia facendo una sostituzione di like per like, che non riesco a immaginare cambierebbe nulla. Mi sto perdendo qualcosa di speciale su come funziona la sintassi qui?
Platinum Azure,

16
@PlatinumAzure Non so perché nessuno abbia mai pensato di rispondere alla tua domanda. \rha un comportamento diverso nella parte di ricerca rispetto alla parte di sostituzione. Vedere stackoverflow.com/a/3834303 per esempio.

O :%s/^V^M/^V^M/g vedi qui
tomd

@ TomD Il link si riferisce alla risposta che stai commentando.
bzeaman,

Per me questo ha sostituito i fastidiosi personaggi con una nuova riga aggiuntiva. @ dlk5730 la risposta ha funzionato meglio per me. vale a dire:%s/\r//g
marcusshep,

37

Probabilmente significa che hai i ritorni a capo (diversi sistemi operativi utilizzano modi diversi di segnalare la fine della linea).

Utilizzare dos2unixper correggere i file o impostare i formati di file in vim:

set ffs=unix,dos

19

Supponiamo che il tuo file di testo sia - file.txt, quindi esegui questo comando -

dos2unix file.txt 

Converte il file di testo da DOS in formato UNIX.


Funziona perfettamente!
robe007,

9

Ho ottenuto un file di testo originariamente generato su una macchina Windows tramite un utente Mac e avevo bisogno di importarlo in un DB MySQL Linux usando il load datacomando.

Sebbene VIM mostrasse il carattere '^ M', nessuna delle precedenti ha funzionato per il mio problema specifico, i dati venivano importati ma erano sempre corrotti in qualche modo. La soluzione alla fine è stata piuttosto semplice (dopo molte frustrazioni).

Soluzione: eseguire dos2unix TWICE sullo stesso file ha funzionato! L'uso del filecomando mostra cosa sta succedendo lungo la strada.

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

E la versione finale del file è stata importata perfettamente nel database.


9

In Unix è probabilmente più facile usare il comando 'tr'.

cat file1.txt | tr "\r" "\n" > file2.txt

9

Li ho rimossi tutti con sed:

sed -i -e 's/\r//g' <filename>

Potrebbe anche sostituire con una stringa o un carattere diversi:

sed -i -e 's/\r/string/g' <filename>

Questi sedcomandi funzionano sulla versione GNU / Linux di, sedma potrebbe essere necessario modificare i BSD (incluso macOS).




2

Se interrompe la configurazione e i caratteri ^ M sono richiesti nelle mappature, puoi semplicemente sostituire i caratteri ^ M con <Enter>o anche <C-m>(entrambi digitati come semplici sequenze di caratteri, quindi rispettivamente 7 e 5 caratteri).

Questo è l'unico modo portatile raccomandato di memorizzare codici chiave speciali nelle mappature


2

In FreeBSD, puoi cancellare ^Mmanualmente digitando quanto segue:

:%s/ Ctrl+ V, quindi Ctrl+ M, quindi di nuovo Ctrl+ M.


1

Se non è stato specificato fileformatintenzionalmente un diverso (ad esempio, :e ++ff=unixper un file Windows), è probabile che il file di destinazione abbia EOL miste.

Ad esempio, se un file ha alcune righe con <CR><NL>finali e altri con <NL>finali e fileformatviene impostato unixautomaticamente da Vim durante la lettura, ^M (<CR>)apparirà. In tali casi, fileformatsentra in gioco. Vedi :help ffsper i dettagli.


0

Ho scoperto che ho inquinato i file per settimane a causa del fatto che la mia istanza di Homebrew Mvim è stata impostata per utilizzare filetype = dos. Apportato il cambiamento richiesto in .vimrc ....


0

prova :%s/\^M//Almeno questo ha funzionato per me.

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.