web-dev-qa-db-fra.com

Emacs peut-il indenter une grosse quantité de HTML pour moi?

Lors de l'édition de HTML dans emacs, existe-t-il un moyen de formater automatiquement un blob de balisage en modifiant quelque chose comme ceci:

  <table>
  <tr>
<td>blah</td></tr></table>

... dans ceci:

<table>
 <tr>
  <td>
   blah
  </td>
 </tr>
</table>
65
raldi

Par défaut, lorsque vous visitez un fichier .html dans Emacs (22 ou 23), il vous place dans html-mode. Ce n'est probablement pas ce que vous voulez. Vous voulez probablement nxml-mode, ce qui est vraiment luxueux. nxml-mode semble ne venir qu'avec Emacs 23, bien que vous puissiez le télécharger pour les versions antérieures d’emacs à partir du site Web de nXML . Il existe également un paquet Debian et Ubuntu nommé nxml-mode. Vous pouvez entrer nxml-mode avec:

M-x nxml-mode

Vous pouvez afficher la documentation en mode nxml avec:

C-h i g (nxml-mode) RET

Ceci étant dit, vous devrez probablement utiliser quelque chose comme Tidy pour reformater votre exemple xhtml. nxml-mode va vous chercher

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
<body>
<table>
  <tr>
<td>blah</td></tr></table>
</body>

à

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
  <body>
    <table>
      <tr>
    <td>blah</td></tr></table>
</body>
</html>

mais je ne vois pas de facilité plus générale pour faire des sauts de ligne sur certaines balises XML comme vous le souhaitez. Notez que C-j insérera une nouvelle ligne avec l’indentation appropriée. Vous pourrez donc faire une macro rapide ou hacker une defun qui fera vos tables.

28
jfm3

Vous pouvez faire sgml-pretty-print puis indent-for-tab sur la même région/mémoire tampon, à condition que vous soyez en mode html ou en mode nxml.

sgml-pretty-print ajoute de nouvelles lignes aux endroits appropriés et indent-for-tab ajoute une indentation de Nice. Ensemble, ils aboutissent à un format HTML/XML correctement formaté.

92
vava

http://www.delorie.com/gnu/docs/emacs/emacs_277.html

Après avoir sélectionné la région que vous souhaitez corriger. (Pour sélectionner tout le tampon, utilisez C-x h)

C-M-q

Réindente toutes les lignes dans un groupe entre parenthèses (indent-sexp).

CM-\

Réindentir toutes les lignes de la région (région en retrait). 

13
Jay

j'ai moi-même écrit une fonction pour le faire pour XML, qui fonctionne bien en mode NXML. devrait aussi bien fonctionner pour le HTML:

(defun jta-reformat-xml ()
  "Reformats xml to make it readable (respects current selection)."
  (interactive)
  (save-excursion
    (let ((beg (point-min))
          (end (point-max)))
      (if (and mark-active transient-mark-mode)
          (progn
            (setq beg (min (point) (mark)))
            (setq end (max (point) (mark))))
        (widen))
      (setq end (copy-marker end t))
      (goto-char beg)
      (while (re-search-forward ">\\s-*<" end t)
        (replace-match ">\n<" t t))
      (goto-char beg)
      (indent-region beg end nil))))
10
jtahlborn

Vous pouvez faire une regexp de remplacement

 M-x replace-regexp

 \(</[^>]+>\)

 \1C-q-j

Indenter tout le tampon

 C-x h
 M-x indent-region
8
nevcx

Cette question est assez ancienne, mais je n’étais pas vraiment satisfaite des différentes réponses. Un moyen simple de réindenter un fichier HTML, étant donné que vous utilisez une version relativement récente d’emacs (j’utilise la version 24.4.1), consiste à:

  • ouvrir le fichier dans emacs
  • marquer le fichier entier avec C-x h (note: si vous voulez voir ce qui est marqué, ajoutez (setq transient-mark-mode t) à votre fichier .emacs)
  • exécuter M-x indent-region

Ce qui est bien avec cette méthode est qu’elle ne nécessite aucun plugin (suggestion de Conway), ne nécessite pas de regexp de remplacement (suggestion de nevcx), ni de changement de mode (suggestion de jfm3). La suggestion de Jay va dans la bonne direction - en général, l'exécution de C-M-q s'indentera selon les règles d'un mode - par exemple, C-M-q fonctionne, selon mon expérience, en js-mode et dans plusieurs autres modes. Mais ni html-mode ni nxml-mode ne semblent pas implémenter C-M-q

6
abhillman

Tidy peut faire ce que vous voulez, mais il semble que pour tout le tampon (et le résultat est XHTML) 

M-x tidy-buffer
6
Chris Conway

Vous pouvez diriger une région vers xmllint (si vous en avez une) en utilisant:

M-|
Shell command on region: xmllint --format -

Le résultat se retrouvera dans un nouveau tampon.

Je fais cela avec XML et cela fonctionne, bien que je pense que xmllint a besoin de certaines autres options pour travailler avec HTML ou un autre XML non parfait. nxml-mode vous dira si vous avez un document bien formé.

4
Geoff

Dans emacs 25, que je suis en train de construire à partir de la source, si vous êtes en mode HTML, utilisez
Ctrl-x
h

pour tout sélectionner, puis appuyez sur Tab.

4
Aaron Hall

Le moyen le plus simple de le faire est via la ligne de commande.

  • Assurez-vous que vous avez bien rangé installé
  • tapez tidy -i -m <<file_name>>

Notez que l'option -m remplace le fichier récemment rangé par l'ancien. Si vous ne le souhaitez pas, vous pouvez taper tidy -i -o <<tidied_file_name>> <<untidied_file_name>>

Le -i est pour l'indentation. Vous pouvez également créer un fichier .tidyrc avec des paramètres tels que 

indent: auto
indent-spaces: 2
wrap: 72
markup: yes
output-xml: no
input-xml: no
show-warnings: yes
numeric-entities: yes
quote-marks: yes
quote-nbsp: yes
quote-ampersand: no
break-before-br: no
uppercase-tags: no
uppercase-attributes: no

De cette façon, tout ce que vous avez à faire est de taper tidy -o <<tidied_file_name>> <<untidied_file_name>>.

Pour plus, tapez simplement man tidy sur la ligne de commande. 

0
user1454331