2009-04-08 19 views
53

Manchmal muss ich Protokolldateien lesen, die^M (control-M) in den Zeilenenden haben. Ich kann eine globale Ersetzung durchführen, um sie loszuwerden, aber dann wird etwas mehr in die Protokolldatei protokolliert und natürlich kommen alle zurück.Versteckt^M in Emacs

Einstellen der Unix-Stil oder DOS-Stil End-of-Line-Codierung scheint nicht viel Unterschied (aber Unix-Stil ist meine Standardeinstellung). Ich verwende das unentschiedene (unix | dos) Kodierungssystem.

Ich bin auf Windows, lesen Log-Dateien von log4net erstellt (obwohl log4net ist offensichtlich nicht die einzige Quelle für diese Belästigung).

Irgendwelche Hinweise?

+1

Leider Set-Puffer-Datei-Codierung-System es nicht tut. Der Puffer wird mit der Moduszeile UNIX geöffnet. Wenn C-x RET f UNIX RET übergeben wird, wird der Puffer als modifiziert markiert, ohne die lästigen^M's zu verbergen. –

+0

E-Mails in GNUS sind ein weiterer Ort, an dem Sie Puffer mit gemischter End-of-Line-Codierung finden können. Zum Beispiel, wenn man von einer Windows-zentrierten Institution sendet, vielleicht Outlook. Die Header-Info erhält die Unix-EOL-Codierung. –

Antwort

3

Ich glaube, Sie die Zeile Codierungssystem ändern kann die Datei mit auf das Unix-Format wird

C-x RET f UNIX RET 

Wenn Sie das tun, sollte der Modus Linie ändern das Wort „(Unix)“ hinzuzufügen, und Alle diese M sollten verschwinden.

+0

Nicht hilfreich, denke ich. set-buffer-file-coding-system scheint den tatsächlichen Inhalt der bearbeiteten Datei zu ändern. – hillu

+0

Einzige Lösung, die für mich funktioniert hat. Danke –

+0

Angeben des Kodierungssystems 'unix' funktionierte nicht für mich - aber das Spezifizieren von' dos' tat (nachdem ich den Puffer zurückstellte). –

4

Wenn Sie die Protokolldateien anzeigen und einfach die^M ausblenden möchten, anstatt sie tatsächlich zu ersetzen, können Sie Drew Adams highlight extension dazu verwenden.

können Sie entweder schreiben elisp Code oder eine Tastatur-Makros machen die folgenden

select the whole buffer 
hlt-highlight-regexp-region 
C-q C-M 
hlt-hide-default-face 

Dies wird markieren Sie zuerst die^M zu tun, und dann verstecken. Wenn Sie sie zurück verwenden möchten, verwenden Sie `hlt-show-default-face '

+0

Danke für den Plug, Justin. Ich fügte eine andere (andere) Lösung unten hinzu. Mehr als eine Möglichkeit, eine Katze zu häuten ... – Drew

6

Was ist los?

C-x RET c dos RET C-x C-f FILENAME RET 

Ich habe eine Datei, die zwei Zeilen hat, mit der zweiten einen Wagenrücklauf. Emacs würde die Datei in Unix-Codierung öffnen, und das Wechseln des Codierungssystems tut nichts. Die obige universal-coding-system-argument funktioniert jedoch.

+4

Leicht modifiziert für eine bereits geöffnete Datei: 'C-x RET cdos RET M-x Rückstellungspuffer RET' – Shelvacu

20

Moderne Versionen von emacs wissen, wie man sowohl mit UNIX- als auch mit DOS-Zeilenenden umgehen kann. Wenn^M in der Datei auftaucht, bedeutet das, dass es eine Mischung aus beiden in der Datei gibt. Wenn es eine solche Mischung gibt, verwendet Emacs standardmäßig den UNIX-Modus, so dass die^Ms sichtbar sind. Der eigentliche Fix besteht darin, das Programm so zu reparieren, dass die Datei konsistente Zeilenenden verwendet.

+3

Emacs ist falsch. Die wirkliche Lösung ist, Emacs zu reparieren. Z.B. git erstellt Konfliktdateien, die in den Kontrollzeilen kein^M s enthalten (z. B. Zeilen, die mit <<<<<< beginnen). Es ist vollkommen richtig, dass git die Zeile ignoriert, die die Datei beendet, da die Kontrollzeilen "meta" sind. – EoghanM

68
(defun remove-dos-eol() 
    "Do not show ^M in files containing mixed UNIX and DOS line endings." 
    (interactive) 
    (setq buffer-display-table (make-display-table)) 
    (aset buffer-display-table ?\^M [])) 

Lösung von Johan Bockgård. Ich fand es here.

+0

funktioniert es charmant. Warum akzeptiert TS diese Antwort nicht? Danke, – swdev

+4

Wenn Sie wollen, dass diese Funktion ausgeführt wird, fügen Sie fast immer folgendes zu Ihren '.emacs' hinzu (nahm mir etwas Zeit, um es herauszufinden):' (add-hook 'text-mode-hook' remove-dos-eol) ' – Henrik

+1

JAHRE Ich habe die^M ertragen. Vielen Dank. – EoghanM

1

Sie können den Anzeigetabelleneintrag des Control-M-Zeichens (^M) ändern, damit es als Leerzeichen angezeigt wird oder sogar ganz verschwindet (nichtssagend). Siehe den Code in der Bibliothek pp-c-l.el (Pretty Control-L) zur Inspiration. Es zeigt ^L Zeichen auf eine beliebige Art und Weise.

Bearbeitet: Hoppla, ich habe gerade festgestellt, dass @binOr diese Methode bereits erwähnt hat.

3

Edrics Antwort sollte mehr Aufmerksamkeit bekommen. Johan Bockgårds Lösung behandelt die Beschwerde des Posters insofern, als sie das^M unsichtbar macht, aber das zugrundeliegende Problem nur maskiert und das weitere Mischen von Unix- und DOS-Zeilenenden fördert.

Die richtige Lösung wäre, ein globales M-x replace-regexp zu machen, um alle Zeilenenden zu DOS-Einsen (oder Unix, je nachdem). Dann schließe und öffne die Datei (nicht sicher, ob M-x revert-buffer ausreichen würde) und die^Ms sind entweder alle unsichtbar oder alle verschwunden.

+3

Mx ersetze-String Cq Cm RET (aus http://lists.netisland.net/archives/plug/plug-1999-06/msg00365.html) –

2

Diesen in Ihrem .emacs:

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

Jetzt können Sie einfach dos2unix aufrufen und entfernen Sie die alle ^M Zeichen.

0

Wenn Sie ^M s in empfangenen E-Mails in Gnus auftreten, können Sie W c (waschen CRs) verwenden oder

(setq gnus-treat-strip-cr t) 
0

Antwort des sudeepdino008 nicht für mich arbeiten (ich nicht auf seine Antwort kommentieren konnte, so dass ich musste meine eigene Antwort hinzufügen.).

konnte ich es beheben könnte diesen Code verwenden:

(defun dos2unix() 
    "Replace DOS eolns CR LF with Unix eolns CR" 
    (interactive) 
    (goto-char (point-min)) 
     (while (search-forward (string ?\C-m) nil t) (replace-match ""))) 
+0

In der Zukunft ein '@' vor dem Namen einer Person: @RMK – Czipperz