Wie verschönere / formatiere ich einen XML-Puffer?

17

Ich habe eine Datei mit XML in einer Zeile. Ist die Funktionalität bereits vorhanden, um diesen Puffer so zu formatieren, dass er vom Benutzer gelesen werden kann?

wdkrnls
quelle
4
FWIW Diese Frage wurde auf stackoverflow gestellt: stackoverflow.com/questions/12492/…
YoungFrog

Antworten:

24

Ist die Funktionalität bereits vorhanden, um diesen Puffer so zu formatieren, dass er vom Benutzer gelesen werden kann?

Natürlich, und Sie haben viele Möglichkeiten. Ich würde es wahrscheinlich an ein externes Programm weiterleiten mit:

C-x h C-u M-| xmllint --format - RET

Dieses Programm kommt mit libxml2. Sie könnten auch verwenden tidy. Hier ist eine Liste der XML-Formatierungstools für die Befehlszeile: /programming/16090869/how-to-pretty-print-xml-from-the-command-line

Sie können auch suchen und ersetzen und dann einrücken:

M-% > < RET > C-q C-j < RET ! C-M-\

Ordentlicher Trick: Sie können den obigen String wie folgt in M-:( eval-expression) kopieren und einfügen :

(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
Kindermädchen
quelle
Eine nette Antwort, aber seien Sie vorsichtig, dass der Befehl, wie er jetzt geschrieben wurde, den Pufferinhalt durch die Ausgabe des Shell-Befehls ersetzt. Dies liegt am C-uPräfix.
FredrikHedman
3
Antwort bedeutet, dass Emacs das nicht kann.
Sergey Kostrukov
13

Der eingebaute in sgml-modehat einen Befehl , dies zu tun: sgml-pretty-print. Wenn Sie dabei sind nxml-mode, müssen Sie zunächst auf wechseln sgml-mode. Sie können einen Befehl schreiben, um vorübergehend in den sgml-Modus zu wechseln, pretty-print auszuführen und dann zurück in den nxml-Modus zu wechseln.

Hier ist zum Beispiel ein Befehl, mit dem die Region hübsch gedruckt wird, optional mit aktivierter automatischer Füllung:

(defun xml-pretty-print (beg end &optional arg)
  "Reformat the region between BEG and END.
    With optional ARG, also auto-fill."
  (interactive "*r\nP")
  (let ((fill (or (bound-and-true-p auto-fill-function) -1)))
    (sgml-mode)
    (when arg (auto-fill-mode))
    (sgml-pretty-print beg end)
    (nxml-mode)
    (auto-fill-mode fill)))
Glucas
quelle
7

schreib das in dein ~/.emacs.d/init.el:

(require 'sgml-mode)

(defun ninrod/reformat-xml ()
  (interactive)
  (save-excursion
    (sgml-pretty-print (point-min) (point-max))
    (indent-region (point-min) (point-max))))

lade emacs neu und rufe dann einfach M-x reformat-xmlden schlecht formatierten xml-puffer auf.

Quelle: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

Ninrod
quelle
0

Wenn Sie dem Hinweis der obigen Antwort folgen und davon ausgehen, dass Sie tidyeine Variante installiert haben , könnte dies sein:

`C-x h M-| tidy -quiet -xml -utf8 -indent -`

Dadurch wird ein neuer Puffer geöffnet, *Shell Command Output*anstatt den Inhalt des Puffers direkt zu ersetzen. Ersetzen Sie nach Überprüfung des Ergebnisses den alten Inhalt durch den neuen durch:

C-x h M-insert-buffer

Wählen Sie die vorgeschlagene Standardeinstellung, die wahrscheinlich sein wird *Shell Command Output*. Sie können den Befehl für später mit einem Tastaturmakro speichern:

C-x ( C-x h M-| tidy -quiet -xml -utf8 -indent - C-x)
C-x C-k n pretty-xml

Damit können Sie ausführen, M-x pretty-xmlum den Puffer neu zu formatieren.

FredrikHedman
quelle
0

Markiere deine xml und mache:

M-x sgml-pretty-print

Oder führen Sie einfach den Befehl ohne markierten Bereich aus, um den gesamten Puffer zu verschönern.

Draxil
quelle