Was bedeutet ^ M Zeichen in Vim?

500

Ich ^Mbekomme immer Charakter in mein vimrc und es bricht meine Konfiguration.

Max
quelle
35
Übrigens ist dies eine großartige Ressource.
Leichtigkeitsrennen im Orbit
@LightnessRacesinOrbit - Hm, es funktioniert jetzt auch in Formularen. Ich habe meinen Kommentar zurückgezogen und gesagt, der Link sei tot.
ArtOfWarfare
3
Spiegel für @ LightnessRacesinOrbit-Link, der momentan nicht verfügbar ist
alexpls
4
Wenn Sie :digraphsin vim tippen, wird die Digraph-Tabelle angezeigt, mit der @LightnessRacesinOrbit verknüpft ist.
Askewchan
1
Wenn Sie versuchen, diese Art von Charakter durch PHP zu ersetzen, versuchen Sie diese preg_replace('/[\x01]/', ' ' ,$str); Hoffnung, es hilft.
Rachel Geller

Antworten:

561

Unix verwendet 0xA für ein Zeilenumbruchzeichen. Windows verwendet eine Kombination aus zwei Zeichen: 0xD 0xA. 0xD ist das Wagenrücklaufzeichen. ^Mzufällig zeigt vim 0xD an (0x0D = 13, M ist der 13. Buchstabe im englischen Alphabet).

Sie können alle ^MZeichen entfernen , indem Sie Folgendes ausführen:

:%s/^M//g

Wo ^Mwird eingegeben, indem Sie gedrückt halten Ctrlund tippen, vgefolgt von mund dann loslassen Ctrl. Dies wird manchmal als abgekürzt ^V^M, aber beachten Sie, dass Sie es wie im vorherigen Satz beschrieben eingeben müssen, anstatt es wörtlich zu tippen.

Dieser Ausdruck ersetzt alle Vorkommen von ^Mdurch die leere Zeichenfolge (dh nichts). Ich benutze dies, um ^MDateien zu entfernen, die von Windows nach Unix (Solaris, Linux, OSX) kopiert wurden.

Tomasz Stanczak
quelle
9
Nur für den Fall, dass Sie unter Windows arbeiten, wird Strg + V wahrscheinlich zum Einfügen zugeordnet. Wenn dies der Fall ist, ordnen die Standardeinstellungen die Taste "Escapezeichen für Sonderzeichen" Strg + Q zu.
R. Martinho Fernandes
8
Die eigentliche Frage ist, warum Vim die Zeilenenden manchmal automatisch erkennt und korrekt anzeigt und manchmal nicht.
Scott
10
Sie sehen das ^MZeichen, wenn die Datei nicht übereinstimmende Zeilenenden aufweist. Verwenden Sie den von Tomasz bereitgestellten Befehl und geben :fileformat={unix|dos|mac}Sie ihn je nach Betriebssystem ein. Wenn es nur wenige Zeilen ohne das ^MZeichen gibt, möchten Sie wahrscheinlich :fileformat=dos. Wenn Sie Dateien in einem anderen Editor als vim bearbeiten, stellen Sie sicher, dass er so konfiguriert ist, dass er mit den Zeilenenden übereinstimmt (Notepad tut dies nicht, aber jeder seriöse Editor wie Notepad ++ oder TextMate).
Mikkel Paulson
9
Hinweis für Anfänger vi: Dieser Befehl muss manuell eingegeben werden. Wenn Sie es einfach in ein offenes Terminal einfügen und ausführen vi, wird der Fehler "Muster nicht gefunden" angezeigt.
IQAndreas
51
@bluesm Ich musste tatsächlich verwenden :%s/\r//g, um die Wagenrückläufe in meiner Datei zu ersetzen. Das ^ V ^ M-Muster konnte nicht in der Datei gefunden werden, in der ich eine Reihe von ^ M-Zeichen hatte.
jonnybot
139
:%s/\r//g 

hat heute für mich gearbeitet. Aber meine Situation mag etwas anders gewesen sein.

dlk5730
quelle
1
Die Option g ist nicht erforderlich, es gibt nur eine neue Zeile pro Zeile. :%s/\r//würde genügen.
Frogcoder
7
Die Option g kann sehr gut erforderlich sein, da ein Wagenrücklauf nicht unbedingt eine neue Zeile ist. Beim Öffnen im Unix-Modus ist der Wagenrücklauf nur ein weiteres Zeichen, und beim Öffnen im Windows-Modus ist der Wagenrücklauf nur etwas Besonderes, unmittelbar gefolgt vom Zeilenvorschub.
Jonathan Baldwin
65

So übersetzen Sie die neue Zeile, anstatt sie zu entfernen:

:%s/\r/\r/g
Mori
quelle
2
Was soll das eigentlich tun? Für mich sieht es so aus, als würde es Gleiches durch Gleiches ersetzen, was ich mir nicht vorstellen kann, etwas zu ändern. Vermisse ich etwas Besonderes an der Funktionsweise der Syntax hier?
Platinum Azure
16
@PlatinumAzure Ich weiß nicht, warum niemand jemals daran gedacht hat, Ihre Frage zu beantworten. \rhat ein anderes Verhalten im Suchteil als im Ersatzteil. Siehe zum Beispiel stackoverflow.com/a/3834303 .
Oder :%s/^V^M/^V^M/g sehen Sie hier
Tomd
@TomD Der Link verweist auf die Antwort, die Sie kommentieren.
Bzeaman
Für mich ersetzte dies die nervigen Zeichen durch einen zusätzlichen Zeilenumbruch. @ dlk5730 Antwort funktionierte besser für mich. dh:%s/\r//g
marcusshep
37

Dies bedeutet wahrscheinlich, dass Sie Wagenrückläufe haben (verschiedene Betriebssysteme verwenden unterschiedliche Methoden, um das Zeilenende zu signalisieren).

Verwenden Sie dos2unixdiese Option, um die Dateien zu reparieren oder die Dateiformate in vim festzulegen:

set ffs=unix,dos
cnicutar
quelle
19

Angenommen, Ihre Textdatei lautet - file.txt, und führen Sie diesen Befehl aus.

dos2unix file.txt 

Es konvertiert die Textdatei vom Dos- in das Unix-Format.

akritaag
quelle
Funktioniert perfekt !
robe007
9

Ich habe eine Textdatei erhalten, die ursprünglich von einem Mac-Benutzer auf einem Windows-Computer generiert wurde, und musste sie mit dem load dataBefehl in eine Linux-MySQL-Datenbank importieren .

Obwohl VIM das Zeichen '^ M' anzeigte, funktionierte keines der oben genannten für mein spezielles Problem. Die Daten wurden importiert, waren jedoch immer auf irgendeine Weise beschädigt. Die Lösung war am Ende ziemlich einfach (nach viel Frust).

Lösung: Das dos2unix zweimalige Ausführen derselben Datei hat den Trick getan! Die Verwendung des fileBefehls zeigt, was auf dem Weg passiert.

$ 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

Und die endgültige Version der Datei wurde perfekt in die Datenbank importiert.

Anthony Palmer
quelle
9

Unter Unix ist es wahrscheinlich einfacher, den Befehl 'tr' zu verwenden.

cat file1.txt | tr "\r" "\n" > file2.txt
Irving Rabin
quelle
9

Ich habe sie alle mit sed entfernt:

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

Könnte auch durch eine andere Zeichenfolge oder ein anderes Zeichen ersetzt werden:

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

Diese sedBefehle funktionieren in der GNU / Linux-Version von sed, müssen jedoch möglicherweise an BSDs (einschließlich macOS) angepasst werden.

Freedom_Ben
quelle
4

Sie können dies in vim mit beheben

:1,$s/^V^M//g

Dabei ist ^ das Steuerzeichen.

Scott C Wilson
quelle
2
Dies erklärt nicht, was ^Mist.
Leichtigkeitsrennen im Orbit
2
Er fragt nicht wirklich, was es ist, er fragt, wie man es repariert. Was es ist, ist ein Wagenrücklaufzeichen von DOS.
Scott C Wilson
3
Ich weiß was es ist. Der Titel der Frage lautet "Was bedeutet ^ M Zeichen in Vim".
Leichtigkeitsrennen im Orbit
3

Dies ist das einzige, was in meinem Fall funktioniert hat:

:e ++ff=dos

:wq

Sardeep Lakhera
quelle
2

Wenn Ihre Konfiguration dadurch unterbrochen wird und die ^ M-Zeichen in Zuordnungen erforderlich sind, können Sie die ^ M-Zeichen einfach durch <Enter>oder sogar ersetzen <C-m>(beide als einfache Zeichenfolgen eingegeben, also 7 bzw. 5 Zeichen).

Dies ist die einzige empfohlene, tragbare Methode zum Speichern spezieller Schlüsselcodes in Zuordnungen

sehe sehen
quelle
2

In FreeBSD können Sie das ^Mmanuell löschen, indem Sie Folgendes eingeben:

:%s/ Ctrl+ V, dann Ctrl+ M, dann Ctrl+ Mwieder.

Victor Ong
quelle
1

Wenn Sie nicht fileformatabsichtlich eine andere angegeben haben (z. B. :e ++ff=unixfür eine Windows-Datei), ist es wahrscheinlich, dass die Zieldatei gemischte EOLs enthält.

Zum Beispiel, wenn eine Datei ein paar Zeilen mit hat <CR><NL>Endungen und andere mit <NL>Endungen, und fileformatwird eingestellt unixautomatisch von Vim , wenn es zu lesen, ^M (<CR>)wird angezeigt. In solchen Fällen fileformatskommt ins Spiel. Siehe :help ffsfür die Details.

ebk
quelle
0

Ich habe festgestellt, dass ich seit Wochen Dateien verschmutzt habe, weil meine Homebrew Mvim-Instanz auf filetype = dos eingestellt war. Die erforderliche Änderung in .vimrc vorgenommen ....

nichg
quelle
0

versuchen :%s/\^M//Zumindest für mich gearbeitet.

xuc
quelle