84 votes

Impression jolie des 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 un joli formatage des balises.

J'ai cherché à imprimer à peu près tout le fichier avec l'indentation et à le sauvegarder, mais je n'ai pas pu trouver de moyen automatique.

Existe-t-il un moyen ? Ou au moins un éditeur sous linux qui peut le faire.

113voto

Juan Garcia Points 391

Vous n'avez même pas besoin d'écrire votre propre fonction - sgml-mode (un module de base de gnu emacs) a une 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 ceci belle imprimante qui répare les lignes brisées en premier.

0 votes

Comment exécuter une fonction en passant la région comme argument ?

1 votes

(sgml-pretty-print (region-beginning) (region-end))

7 votes

Je ne suis pas sûr de savoir comment sgml-mode pourrait avoir changé au fil du temps. Aujourd'hui, j'ai invoqué C-x C-f foo.xml , M-x sgml-mode alors M-x sgml-pretty-print et mon fichier xml a été imprimé. (Enfin, emacs s'est arrêté pendant vingt secondes ou plus avant de terminer. C'était un fichier d'une ligne avant le pretty print et de 720 lignes après).

88voto

Christian Berg Points 7039

Si vous n'avez besoin que d'une jolie mise en retrait sans introduire de nouveaux sauts de ligne, vous pouvez appliquer l'attribut indent-region à l'ensemble du tampon avec ces touches :

C-x h
C-M-\

Si vous avez également besoin d'introduire des sauts de ligne, afin 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 suis d'accord pour 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") (setq end (1+ end)))
    (indent-region begin end))
  (message "Ah, much better!"))

Cela ne dépend pas d'un outil externe comme Tidy.

1 votes

Bon defun, merci. En enlevant le (nxml-mode) du defun pretty-print ci-dessus, cela lui permet de fonctionner dans le sgml-mode qui est intégré à emacs 22.2.1. Mais je l'ai modifié pour faire tout le tampon de (point-min) à (point-max) parce que c'est mon truc principal. Aussi, un bug : pour chaque nouvelle ligne que vous insérez, vous devrez incrémenter end.

0 votes

Comment puis-je utiliser cette fonction dans Emacs ? J'ai copié et collé le code de la fonction dans le fichier gratter et l'a évalué. Maintenant, comment puis-je invoquer cette fonction ?

1 votes

Après avoir évalué le defun, vous pouvez l'invoquer comme n'importe quelle autre fonction : M-x bf-pretty-print-xml-region. (Vous n'êtes pas obligé de tout taper, bien sûr, utilisez la complétion par tabulation : M-x bf<tab> devrait suffire). Vous ne voulez probablement pas définir la fonction à chaque fois que vous voulez l'utiliser, donc mettez-la quelque part où elle sera chargée au démarrage, par exemple dans ~/.emacs.d/init.el

35voto

Tim Helmstedt Points 687

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

"M-| xmllint --format -" formatera la région sélectionnée.

"C-u M-| xmllint --format -" fera de même, en remplaçant la région par la sortie

0 votes

Utilisez M-x mark-whole-buffer devant pour marquer le contenu entier du tampon comme la région à traiter.

25voto

Marcel Levy Points 2378

J'utilise Mode nXML pour l'édition et Tidy lorsque je veux formater et indenter du XML ou du HTML. Il existe également une interface Emacs pour Tidy.

0 votes

À la fin de 2013, tidy.el Version : 20111222.1756 ne fonctionne pas sur Emacs 24 avec wrong type argument: stringp, nil

0 votes

@keiw C'est probablement parce que vous le faites dans un tampon qui n'a pas de nom de fichier. J'ai eu la même erreur et je l'ai attribuée à cela, du moins de mon côté.

20voto

bubak Points 71

Grâce à Tim Helmstedt ci-dessus j'ai fait st 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.

3 votes

Cela m'a donné une erreur sur GNU Emacs 24, donc j'ai changé la dernière ligne en : (indent-region 0 (count-lines (point-min) (point-max)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X