Was sind diese ^ M's, die in meinen Dateien in Emacs immer wieder auftauchen?

157

Ich denke, es hat vielleicht mit textmate zu tun, aber wir arbeiten in einem kleinen Team und haben einige Probleme mit vollständigen Dateikonflikten nahezu identischer Dateien in git, da an jede Zeile eines Zweigs ein ^ M angehängt ist.

Was soll dieser mysteriöse ^MCharakter tun und woher könnte er kommen?

Unsere Entwickler verwenden Emacs unter Windows / Mac, TextMate unter Mac, Coda unter Mac und gelegentlich den Texteditor wp-admin.

Hat jemand jemals dieses Problem, das von einem dieser Probleme herrührt?

Neil Sarkar
quelle
3
Für das, was es wert ist: Suche nach "Strg" anstelle von ^
Broam
3
Das größere Problem ist, was werden Sie dagegen tun? Wahrscheinlich stellt Emacs sie nicht vor. Ihr Team sollte entscheiden, ob die Dateien im DOS-Format (mit ^ M) oder im Unix-Format (ohne ^ M) vorliegen sollen, und dies durchsetzen.
Trey Jackson

Antworten:

111

In git-config gesetzt , core.autocrlfum trueautomatisch zu machen git Zeilenenden korrekt für Ihre Plattform umwandeln, zum Beispiel diesen Befehl für eine globale Einstellung:

git config --global core.autocrlf true
Josh Lee
quelle
6
Ich denke, dies ist die beste Antwort, weil sie die Frage im Kontext des OP beantwortet, nämlich git.
Neontapir
Ich hatte bereits "[core] \ n autocrlf = true" in meiner '~ / .gitconfig'-Datei, aber es ließ mich trotzdem' git clone code.google.com/p/pytomtom 'mit' ^ m 'Zeichen ??? ??
Big Rich
11
Diese Antwort gilt NUR , wenn Ihre Plattform Windows ist! Wenn Sie unter Mac / Linux arbeiten, sollte "true" zu "input" werden! Siehe help.github.com/articles/dealing-with-line-endings und hier: stackoverflow.com/questions/9225599/…
K.-Michael Aye
WARNUNG: Diese Antwort beschädigt dann viele andere Dateien, wenn git fälschlicherweise "vermutet", dass die Zeilenenden unwichtig sind und geändert werden müssen. Dies ist tödlich für Softwareprojekte, bei denen diese Zeichen in einer Datendatei vorhanden sind (ja, ich bin dadurch verbrannt worden, schmerzhaft zu lösen). Es ist meiner Meinung nach eine schreckliche Lösung.
Adam
@Adam Was genau unterbricht die Änderung der Zeilenenden? Wo hatten Sie Probleme bei der Arbeit mit Daten? Es sollte nichts beeinflussen, es ist nur eine andere Art, das Zeilenende zu markieren. Ich habe mich nur gewundert.
MBI
97

Jemand konvertiert seine Zeilenendezeichen nicht richtig .

Ich nehme an, es sind die Windows-Leute, die ihre CRLF lieben. Unix liebt LF und Mac liebte CR, bis es auf Unix-Weise gezeigt wurde.

Broam
quelle
12
Zur Verdeutlichung: Mac verwendete CR bis Version 10 (OS X), jetzt LF.
Mikael S
34
Ich halte den Windows-Weg für logischer, da die Begriffe CR und LF aus der Zeit der Schreibmaschinen stammen. Sie mussten beides tun: einen Wagenrücklauf, um den Eingabepunkt an den Zeilenanfang zu bringen, und einen Zeilenvorschub, um eine Zeile nach unten zu scrollen. Die Mac OS Classic-Methode (CR) auf einer Schreibmaschine überschreibt immer wieder dieselbe Zeile. Die Unix-Methode (LF) auf einer Schreibmaschine gibt gestaffelten Text aus, bis Sie die volle Breite der Seite erreicht haben. :)
Otherside
114
@Otherside: logischer nur im Sinne von "Wir wollen eine Schreibmaschine emulieren". Ich kann nicht verstehen, warum das überhaupt noch nützlich ist.
Bryan Oakley
29
@Otherside, warum sollten Sie etwas mit zwei Zeichen darstellen, wenn es mit einem Zeichen dargestellt werden kann?
Matthew G
13
@ Matthew G: Alles kann in einem Charakter dargestellt werden, solange viele von uns damit einverstanden sind. Heißt das, wir sollten? Wir können alle unsere Nachrichten ohne Interpunktion, Großbuchstaben und nur jeden Satz in einer neuen Zeile eingeben, und jeder würde es verstehen. Heißt das, wir sollten? Es geht nicht darum, "etwas zu tun, weil wir können". Trotzdem bevorzuge ich auch den LF.
Jaffog
33

^Mist 0x0d, dh das Wagenrücklaufzeichen. Wenn Ihr Display so aussieht

Zeile 1 ^ M.
Zeile 2 ^ M.

Dann muss die Datei von Windows stammen, da die Standard-Newline-Sequenz unter Windows CR LF( 0x0d 0x0a) ist, während die Standard-Newline-Sequenz ausschließlich aus LFUnices besteht.

Wenn die Datei von einem Mac OS 9-System oder einem früheren System stammt, wird dies als angezeigt

Zeile 1 ^ M Zeile 2 ^ M.

weil es nach den Wagenrückläufen keine Zeilenvorschübe geben würde.

Sinan Ünür
quelle
28

Geben Sie Folgendes ein, damit ^ M in git verschwindet:

git config --global core.whitespace cr-at-eol

Credits: https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/

bonif
quelle
1
ändert nichts.
Vivex
3
das lässt das ^ M nur bei Verwendung von git diff vom Display verschwinden, aber es ist immer noch da
FernandoZ
1
In der Tat wird das ^ M nur als Leerzeichen angezeigt, das ^ M wird jedoch git diffbeim Vergleichen von Dateien berücksichtigt. Entfernen Sie diese Einstellung mit git config --global --unset core.whitespace(aus diesem Thread ).
Miguelmorin
1
Sie können auch das weglassen, --globalum nur das aktuelle Repo zu konfigurieren.
Derek Veit
8

Sie haben mit dem Unterschied zwischen Zeilenenden im DOS-Stil und Unix-Stil zu tun. Lesen Sie den Wikipedia-Artikel . Möglicherweise finden Sie ein dos2unix-Tool, das Ihnen hilft, oder schreiben einfach ein kleines Skript, um sie selbst zu beheben.

Bearbeiten : Ich habe hier den folgenden Python-Beispielcode gefunden :

string.replace( str, '\r', '' )
Parappa
quelle
3
In Emacs wäre das <code> M-: (Ersetzungszeichenfolge "\ r" "") </ code>.
Huaiyuan
7

Ich verwende Android Studio (JetBrains IntelliJ IDEA ) unter Mac OS und mein Problem war, dass ^ M in einigen Dateien in meiner Pull-Anfrage auf GitHub angezeigt wurde . Was für mich funktionierte, war das Ändern des Zeilentrennzeichens für eine Datei.

Öffnen Sie die gewünschte Datei im Editor, gehen Sie zu Datei, gehen Sie zu Zeilentrennzeichen und wählen Sie die beste Option für Sie (für mich war es LF - Unix und OS X (\ n) ).

Laut dem nächsten Artikel ist dieses Problem auf verwirrte Zeilenenden zwischen Betriebssystemen zurückzuführen: http://jonathonstaff.com/blog/issues-with-line-endings/

Weitere Informationen finden Sie hier: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

Geben Sie hier die Bildbeschreibung ein

Keks Monster
quelle
6

Anstelle von Query-Replace können Sie auch Mx delete-trailing-whitespace verwenden

Kaineer
quelle
Das hat bei mir nicht funktioniert ... Ich habe den gesamten Text ausgewählt und den Befehl ausgeführt.
Devrimbaris 27.
das hat bei mir funktioniert. Vielen Dank. @devrimbaris, Sie müssen nichts auswählen, Sie führen einfach den Befehl aus. 'M' ist der Metaschlüssel oder der Escape-Schlüssel. Also ist Mx Flucht dann x. Dann geben Sie delete-trailing-whitespace ein und drücken die Eingabetaste.
Astromax
5

Pot das folgende in Ihrem ~/.emacs(oder äquiuvalent)

(defun dos2unix ()
  "Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
    (goto-char (point-min))
      (while (search-forward "\r" nil t) (replace-match "")))

und dann könnten Sie einfach verwenden M-x dos2unix.

Jakub Narębski
quelle
4

^MAm Ende der Zeile in Emacs wird ein Wagenrücklauf (\ r) gefolgt von einem Zeilenvorschub (\ n) angezeigt. Dies wird häufig angezeigt, wenn eine Person Dateien unter Windows bearbeitet (wobei das Zeilenende die Kombination aus Wagenrücklauf und Zeilenumbruchzeichen ist) und Sie unter Unix oder Linux bearbeiten (wobei das Zeilenende nur ein Zeilenumbruchzeichen ist).

Die Kombination von Zeichen ist normalerweise nicht schädlich. Wenn Sie die Quellcodeverwaltung verwenden, können Sie möglicherweise das Eincheckformat für Textdateien so konfigurieren, dass die Zeilen auf magische Weise für Sie angepasst werden. Alternativ können Sie möglicherweise Check-In- und Check-Out-Trigger verwenden, die die Dateien automatisch für Sie "reparieren". Oder Sie können einfach ein Tool wie dos2unix verwenden , um Dinge manuell anzupassen.

atk
quelle
2

Wie jeder schon erwähnt hat. Es ist ein anderer Zeilenendstil. MacOSX verwendet Unix-Zeilenenden, dh LF (Zeilenvorschub).

Windows verwendet sowohl CR (Wagenrücklauf) als auch LF (Zeilenvorschub) als Zeilenende. Da Sie sowohl Windows als auch Mac verwenden, liegt das Problem daran.

Wenn Sie eine Datei in Windows erstellen und dann auf den Mac bringen, werden diese ^ M-Zeichen möglicherweise am Ende der Zeilen angezeigt.

Wenn Sie sie entfernen möchten, können Sie dies sehr einfach in Emacs tun. Markieren und kopieren Sie einfach das Zeichen ^ M und ersetzen Sie ^ M durch, und Sie sind fertig.

BEARBEITEN: Einige andere Links, die hilfreich sein können. http://xahlee.org/emacs/emacs_adv_tips.html

Mit diesem können Sie Emacs so konfigurieren, dass ein bestimmter Typ eines Zeilenendstils verwendet wird. http://www.emacswiki.org/emacs/EndOfLineTips

Matt
quelle
2

Ich bin vor einiger Zeit auf dieses Problem gestoßen. Das ^ M steht für einen Wagenrücklauf. Wenn Sie auf Ctrl-Q Ctrl-M(Dies erzeugt ein wörtliches ^ M) suchen , können Sie dieses Zeichen in Emacs in den Griff bekommen. Ich habe etwas in diese Richtung getan:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]
nedblorf
quelle
2

Wenn auf Ihrem System kein Dienstprogramm dos2unix installiert ist, können Sie ein eigenes Dienstprogramm erstellen, um Windows-Endzeilenzeichen zu entfernen:

vi ~/dos2unix.bash:

mit folgendem Inhalt

#!/bin/bash
tr -d '\r' < $1 > repl.tmp
mv -f repl.tmp $1

Fügen Sie in Ihrem ~ / .bashrc die folgende Zeile hinzu:

alias 'dos2unix=~/dos2unix.bash'

Bewirbt sich

dos2unix file_from_PC.txt

entfernt ^ M Zeichen an Zeilen, die in file_from_PC.txt enden. Sie können überprüfen, ob Sie diese haben oder nicht, indem Sie cat verwenden:

cat -v file_from_PC.txt
Grapesh
quelle
1

Siehe auch:

^ M in Emacs verstecken

Seien Sie vorsichtig, wenn Sie die ^ M-Zeichen entfernen und erneut an Ihr Team senden möchten. Möglicherweise sehen sie danach eine Datei ohne Wagenrücklauf.

Demosthenex
quelle
0

Die Lösung für mich bestand darin, die folgende Elisp-Funktion zu verwenden, die in diesem Emacs-Wiki-Artikel enthalten ist .

 (defun dos2unix ()
      "Not exactly but it's easier to remember"
      (interactive)
      (set-buffer-file-coding-system 'unix 't) )

Führen Sie die Funktion M-x dos2unixim Puffer aus und speichern Sie die Datei. Alle ^Mverschwinden.

Carlo Rodríguez
quelle