Jak wstępnie utrwalić / sformatować bufor XML?

17

Mam plik z XML w jednym wierszu. Czy funkcjonalność już istnieje, aby sformatować ten bufor tak, aby był nieco czytelny dla użytkownika?

wdkrnls
źródło
4
FWIW to pytanie zadano na stackoverflow: stackoverflow.com/questions/12492/…
YoungFrog

Odpowiedzi:

24

Czy funkcjonalność już istnieje, aby sformatować ten bufor tak, aby był nieco czytelny dla użytkownika?

Oczywiście i masz wiele opcji. Prawdopodobnie podałbym go do zewnętrznego programu za pomocą:

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

Ten program pochodzi z libxml2. Możesz także użyć tidy. Oto lista narzędzi do formatowania XML wiersza poleceń: /programming/16090869/how-to-pretty-print-xml-from-the-command-line

Możesz także wyszukać i zastąpić, a następnie wciąć:

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

Zgrabna sztuczka: możesz skopiować i wkleić powyższy ciąg do M-:( eval-expression) w następujący sposób:

(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
niania
źródło
Fajna odpowiedź, ale uważaj, że polecenie, tak jak zostało napisane teraz, zastąpi zawartość bufora danymi wyjściowymi polecenia powłoki. Wynika to z C-uprzedrostka.
FredrikHedman
3
Odpowiedź oznacza, że ​​emacs nie może tego zrobić.
Sergey Kostrukov,
13

Wbudowany sgml-mode ma polecenie, aby to zrobić: sgml-pretty-print. Jeśli jesteś w nxml-modeśrodku, wygląda na to, że musisz przełączyć na sgml-modepierwszy. Możesz napisać polecenie, aby tymczasowo przełączyć się do trybu sgml, uruchomić ładny wydruk, a następnie wrócić z powrotem do trybu nxml.

Na przykład, oto polecenie, które wydrukuje region całkiem ładnie, opcjonalnie z włączonym automatycznym wypełnianiem:

(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
źródło
7

napisz to w swoim ~/.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))))

przeładuj emacsa, a następnie po prostu zadzwoń M-x reformat-xml źle sformatowany bufor xml.

źródło: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

ninrod
źródło
0

Postępując zgodnie z podaną wyżej odpowiedzią i zakładając, że tidyzainstalowałeś wersję, może to być:

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

Spowoduje to otwarcie nowego bufora *Shell Command Output*zamiast bezpośredniej zamiany zawartości bufora. Po sprawdzeniu wyniku zamień starą zawartość na nową na:

C-x h M-insert-buffer

wybierz sugerowaną wartość domyślną, która prawdopodobnie będzie *Shell Command Output*. Możesz zapisać polecenie na później za pomocą makra klawiatury:

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

Dzięki temu możesz wykonać, M-x pretty-xmlaby sformatować bufor.

FredrikHedman
źródło
0

Zaznacz swój plik xml i wykonaj:

M-x sgml-pretty-print

Lub po prostu uruchom polecenie bez zaznaczonego regionu, aby upiększyć cały bufor.

draxil
źródło