Ich verwende Emacs, um eine XML-Datei zu bearbeiten, die auch von einer anderen Anwendung gelesen wird. Die andere Anwendung erfordert, dass die Datei mit einem Byte-Order-Marker (BOM) beginnt. Emacs scheint jedoch die Stückliste jedes Mal zu entfernen, wenn ich die Datei bearbeite. Gibt es eine Möglichkeit, Emacs dazu zu bringen, die Stückliste in Ruhe zu lassen?
8
Antworten:
Emacs schreibt eine Stückliste oder nicht, je nachdem, welches Codierungssystem verwendet wird. Emacs wählt automatisch das Codierungssystem aus, das beim Besuch einer Datei verwendet wird.
Sie können das Codierungssystem in utf-8-with-Signatur ändern, wodurch Emacs angewiesen wird, die Stückliste zu schreiben.
So ändern Sie das Codierungssystem einer besuchten Datei:
Sie können das Codierungssystem festlegen, das Emacs für eine bestimmte Datei verwendet, indem Sie eine Dateivariable festlegen . Weitere Informationen hierzu finden Sie im Abschnitt 57.3.4 Lokale Variablen in Dateien .
quelle
Follow-up zu Richard Hoskins 'Antwort: Wenn Sie nie möchten, dass die Stückliste von Emacs ausgeblendet wird, können Sie die * -mit-Signatur-Codierungen mit diesem Snippet deaktivieren:
Die Stückliste ist U + FEFF, der "nicht unterbrechende Bereich mit der Breite Null", und wird in meinen Emacs 23.1.1 nicht als Feld angezeigt. Stattdessen wird die oberste Zeile der Datei leicht nach unten verschoben, manchmal auch als Feld wird in der ersten Zeile angezeigt. Sie können jedoch sehen, dass die Stückliste vorhanden ist, und sie gegebenenfalls löschen.
quelle
Emacs "selbst" sollte sich nicht mit der Stückliste anlegen. Wenn dies wirklich der Fall ist, muss es sich um den Code handeln, der den Emacs-Modus implementiert, mit dem Sie Ihre XML-Dateien bearbeiten und die Stückliste entfernen. Da Sie nicht sagen, welches das ist, kann ich Sie nur auf die Dokumentation für diesen Modus verweisen oder darauf, dass Sie die Dateien in
fundamental-mode
(oder einem ähnlichen zerstörungsfreien Modus) öffnen . Oder versuchen Sie es,M-x find-file-literally
wenn alles andere fehlschlägt.quelle
find-file-literally
und dies dann tueM-x sgml-mode
, wird die Stückliste nicht entfernt. Da Sonderzeichen beim wörtlichen Besuch einer Datei nicht UTF-8-codiert sind, wäre es hilfreich herauszufinden, wo in der zugrunde liegenden Formatkonvertierung und im Zeichencode-Konvertierungscode die Stückliste entfernt wird.In meinem Test
UTF-8
ändert das Bearbeiten einer Datei nichts an der Codierung und die Stückliste bleibt (efbb bf
). (nxml-Modus)Nun, dies kann zwischen
xml-mode
undnxml-mode
oder der Version von Emacs variieren (24 vs 26). Es heißt der Modus unten.Wenn Sie eine Emacs-XML-Datei bearbeiten, die in Unicode (
UTF-16
Little Endian) codiert ist , wird die Codierung inUTF-16
Big Endian geändert . Vielleicht ist es das, worüber er spricht.Aber die Stückliste ist immer noch da, geändert von
fffe
zuffef
, und die Nullen befinden sich auf dem ungeraden Byte anstelle des geraden Bytes. Sie können es im Hexl-Modus sehen.Beispiel-XML-Datei. Das Codierungsattribut steuert die Codierung, wenn Emacs sie im XML-Modus oder im XML-Modus speichert. Eine zukünftige Version wird gepatcht, um zuerst die Stückliste zu überprüfen.
Es sieht so aus, als würde Emacs
UTF-16
als nehmenUTF-16BE
, während Windows es als nimmtUTF-16LE
(BE und LE funktionieren in Emacs nicht für das Codierungsattribut). Das Codierungsattribut ist wahrscheinlich der Schlüssel zu den Problemen hier.Wenn Sie es in Powershell speichern, wird es wieder in utf-16le konvertiert.
Mit encoding = "UTF-16LE" und encoding = "UTF-16BE" wird die Bom entfernt, wodurch die Datei in Emacs nicht wiederzuerkennen ist. Dies ist ein bestätigter Fehler, der behoben wird: http://lists.gnu.org/archive/html/bug-gnu-emacs/2019-05/msg00892.html
quelle