Comment embellir / formater un tampon XML?

17

J'ai un fichier avec xml sur une seule ligne. La fonctionnalité existe-t-elle déjà pour reformater ce tampon afin qu'il soit quelque peu lisible par l'utilisateur?

wdkrnls
la source
4
FWIW cette question a été posée sur stackoverflow: stackoverflow.com/questions/12492/…
YoungFrog

Réponses:

24

La fonctionnalité existe-t-elle déjà pour reformater ce tampon afin qu'il soit quelque peu lisible par l'utilisateur?

Bien sûr, et vous avez beaucoup d'options. Je le nourrirais probablement dans un programme externe en utilisant:

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

Ce programme est livré avec libxml2. Vous pouvez également utiliser tidy. Voici une liste d'outils de formatage xml en ligne de commande: /programming/16090869/how-to-pretty-print-xml-from-the-command-line

Vous pouvez également effectuer une recherche et remplacer puis indenter:

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

Astuce: vous pouvez copier et coller la chaîne ci-dessus dans M-:( eval-expression) comme ceci:

(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
nounou
la source
Une bonne réponse, mais méfiez-vous que la commande telle qu'elle est écrite maintenant remplacera le contenu du tampon par la sortie de la commande shell. C'est à cause du C-upréfixe.
FredrikHedman
3
La réponse signifie qu'emacs ne peut pas le faire.
Sergey Kostrukov
13

Le haut- sgml-modea une commande pour ce faire: sgml-pretty-print. Si vous y êtes, nxml-modeil semble que vous devez d' sgml-modeabord passer à . Vous pouvez écrire une commande pour basculer temporairement en mode sgml, exécuter pretty-print, puis revenir en mode nxml.

Par exemple, voici une commande qui imprimera joliment la région, éventuellement avec le remplissage automatique activé:

(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
la source
7

écrivez ceci dans votre ~/.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))))

rechargez emacs, puis appelez simplement M-x reformat-xmlle tampon xml mal formaté.

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

ninrod
la source
0

En suivant l'indice de la réponse ci-dessus, et en supposant que vous avez tidyinstallé une variante, cela pourrait être:

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

Cela ouvrira un nouveau tampon *Shell Command Output*au lieu de remplacer directement le contenu du tampon. Après avoir vérifié le résultat, remplacez l'ancien contenu par le nouveau par:

C-x h M-insert-buffer

choisissez la valeur par défaut suggérée qui sera probablement *Shell Command Output*. Vous pouvez enregistrer la commande pour plus tard avec une macro clavier:

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

Avec cela, vous pouvez exécuter M-x pretty-xmlpour reformater le tampon.

FredrikHedman
la source
0

Marquez votre xml et faites:

M-x sgml-pretty-print

Ou exécutez simplement la commande sans région marquée pour embellir tout le tampon.

draxil
la source