Ich benutze Emacs, um meine XML-Dateien zu bearbeiten (nxml-Modus) und die Dateien, die vom Computer generiert wurden, haben keine hübsche Formatierung der Tags.
Ich habe nach hübschem Drucken der gesamten Datei mit Einrückung und Speichern gesucht, konnte aber keinen automatischen Weg finden.
Gibt es einen Weg? Oder zumindest einen Editor unter Linux, der das kann.
wrong type argument: stringp, nil
Sie müssen nicht einmal Ihre eigene Funktion schreiben - der sgml-Modus (ein Gnu-Emacs-Kernmodul) verfügt über eine integrierte hübsche Druckfunktion namens (sgml-Pretty-Print ...), die Anfangs- und Endargumente für Regionen verwendet.
Wenn Sie XML ausschneiden und einfügen und feststellen, dass Ihr Terminal die Zeilen an beliebigen Stellen zerhackt, können Sie diesen hübschen Drucker verwenden, der zuerst unterbrochene Zeilen behebt.
quelle
sgml-mode
sich das im Laufe der Zeit verändert haben könnte. Heute habe ich angerufenC-x C-f foo.xml
,M-x sgml-mode
und dannM-x sgml-pretty-print
und meine XML - Datei wurde ziemlich gedruckt. (Nun, Emacs hingen zwanzig Sekunden oder länger, bevor sieC-x g
den gesamten Puffer als Region auswählen.C-x h
und dannM-x sgml-pretty-print
. Die XML wird jetzt ziemlich formatiert seinWenn Sie nur einen hübschen Einzug benötigen, ohne neue Zeilenumbrüche einzuführen, können Sie den
indent-region
Befehl mit den folgenden Tastenanschlägen auf den gesamten Puffer anwenden :Wenn Sie auch Zeilenumbrüche einführen müssen, damit sich das Öffnen und Schließen von Tags in getrennten Zeilen befindet, können Sie die folgende sehr schöne Elisp-Funktion verwenden, die von Benjamin Ferrari geschrieben wurde . Ich habe es auf seinem Blog gefunden und hoffe, dass ich es hier reproduzieren kann:
Dies hängt nicht von einem externen Tool wie Tidy ab.
quelle
Emacs können beliebige Befehle mit M- | ausführen. Wenn Sie xmllint installiert haben:
"M- | xmllint --format -" formatiert die ausgewählte Region
"Cu M- | xmllint --format -" macht dasselbe und ersetzt den Bereich durch die Ausgabe
quelle
Dank Tim Helmstedt oben habe ich so gemacht:
schnell und einfach. Danke vielmals.
quelle
(indent-region 0 (count-lines (point-min) (point-max)))
Zum Einführen von Zeilenumbrüchen und dann zum hübschen Drucken
quelle
Hier sind einige Verbesserungen, die ich an Benjamin Ferraris Version vorgenommen habe:
search-forward-regexp
hat kein Ende angegeben, also würde es mit Sachen vom Anfang der Region bis zum Ende des Puffers (anstelle des Endes der Region) arbeiten.end
richtig, wie Cheeso bemerkte.<tag></tag>
, wodurch der Wert geändert wird. Ja, technisch gesehen ändern wir hier die Werte von allem, aber ein leerer Start / Ende ist viel wahrscheinlicher von Bedeutung. Verwendet jetzt zwei separate, etwas strengere Suchvorgänge, um dies zu vermeiden.Hat noch das "verlässt sich nicht auf externe Ordnung" usw. Allerdings erfordert es
cl
für dasincf
Makro.quelle
Eine Möglichkeit ist, wenn Sie etwas im folgenden Format haben
Versuchen Sie es in Emacs
Dies wird über dem XML-Beispiel nach unten eingerückt
In VIM können Sie dies tun, indem Sie
Hoffe das hilft.
quelle
HTH
quelle
Ich nahm die Version von Jason Viers und fügte Logik hinzu, um XML-Deklarationen in ihre eigenen Zeilen zu setzen. Dies setzt voraus, dass Sie xmlns = und xmlns haben: ohne dazwischenliegende Leerzeichen.
quelle
Ordentlich sieht aus wie ein guter Modus. Muss es anschauen. Ich werde es verwenden, wenn ich wirklich alle Funktionen brauche, die es bietet.
Wie auch immer, dieses Problem quälte mich ungefähr eine Woche lang und ich suchte nicht richtig. Nach dem Posten habe ich angefangen zu suchen und eine Seite mit einer Elisp-Funktion gefunden, die es ziemlich gut macht. Der Autor schlägt auch vor, Tidy zu verwenden.
Danke für die Antwort Marcel
(schade, dass ich nicht genug Punkte habe, um dich zu verbessern).Werde bald darüber auf meinem Blog posten.Hier ist ein Beitrag darüber (mit einem Link zu Marcel's Seite).quelle
Ich benutze
xml-reformat-tags
von xml-parse.el . Normalerweise möchten Sie den Punkt am Anfang der Datei haben, wenn Sie diesen Befehl ausführen.Es ist interessant, dass die Datei in Emacspeak integriert ist . Als ich Emacspeak Tag für Tag benutzte, dachte ich, es
xml-reformat-tags
sei ein Emacs eingebaut. Eines Tages verlor ich es und musste danach im Internet suchen und betrat damit die oben erwähnte Wiki-Seite.Ich füge auch meinen Code hinzu, um xml-parse zu starten. Ich bin mir nicht sicher, ob dies der beste Teil des Emacs-Codes ist, scheint aber für mich zu funktionieren.
quelle
Wenn Sie Spacemacs verwenden , verwenden Sie einfach den Befehl 'spacemacs / indent-region-or-buffer'.
quelle
Emacs ist ab 2017 standardmäßig bereits mit dieser Funktion ausgestattet, aber Sie müssen diese kleine Funktion in Ihre
~/.emacs.d/init.el
:dann ruf einfach an
M-x reformat-xml
Quelle: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/
quelle
Ich fürchte, ich mag die Benjamin Ferrari-Version viel besser. Der interne hübsche Druck platziert das End-Tag immer in einer neuen Zeile nach dem Wert und fügt unerwünschte CR in die Tag-Werte ein.
quelle