Jolie impression de fichiers XML sur Emacs

J’utilise emacs pour éditer mes fichiers xml (nxml-mode) et les fichiers générés par la machine n’ont pas de formatage correct.

J’ai cherché à imprimer le fichier entier avec indentation et à l’enregistrer, mais je n’ai pas pu trouver une manière automatique.

Y a-t-il un moyen? Ou au moins un éditeur sur Linux qui peut le faire.

J’utilise le mode nXML pour l’édition et le rangement lorsque je veux formater et mettre en retrait XML ou HTML. Il y a aussi une interface d’Emacs pour Tidy.

Vous n’avez même pas besoin d’écrire votre propre fonction – sgml-mode (un module de base de gnu emacs) possède une jolie fonction d’impression intégrée appelée (sgml-pretty-print …) qui prend les arguments de début et de fin de région.

Si vous coupez et collez du XML et que vous trouvez que votre terminal coupe les lignes à des endroits arbitraires, vous pouvez utiliser cette jolie imprimante qui corrige d’abord les lignes brisées.

Si vous n’avez besoin que de peu d’indentation sans introduire de nouveaux sauts de ligne, vous pouvez appliquer la commande indent-region à la totalité du tampon avec ces séquences de touches:

 Cx h CM-\ 

Si vous devez également introduire des sauts de ligne, de sorte que les balises d’ouverture et de fermeture soient sur des lignes séparées, vous pouvez utiliser la très belle fonction elisp suivante, écrite par Benjamin Ferrari . Je l’ai trouvé sur son blog et j’espère que je peux le reproduire ici:

 (defun bf-pretty-print-xml-region (begin end) "Pretty format XML markup in region. You need to have nxml-mode http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do this. The function inserts linebreaks to separate tags that have nothing but whitespace between them. It then indents the markup by using nxml's indentation rules." (interactive "r") (save-excursion (nxml-mode) (goto-char begin) (while (search-forward-regexp "\>[ \\t]*\<" nil t) (backward-char) (insert "\n")) (indent-region begin end)) (message "Ah, much better!")) 

Cela ne repose pas sur un outil externe comme Tidy.

Emacs peut exécuter des commandes arbitraires avec M- |. Si vous avez xmllint installé:

“M- | xmllint –format -” formatera la région sélectionnée

“Cu M- | xmllint –format -” fera la même chose, remplaçant la région par la sortie

Merci à Tim Helmstedt ci-dessus j’ai fait comme ça:

 (defun nxml-pretty-format () (interactive) (save-excursion (shell-command-on-region (point-min) (point-max) "xmllint --format -" (buffer-name) t) (nxml-mode) (indent-region begin end))) 

rapide et facile. Merci beaucoup.