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>
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.
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é.
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).
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))))
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
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 à:
C-x h
(note: si vous voulez voir ce qui est marqué, ajoutez (setq transient-mark-mode t)
à votre fichier .emacs
)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
.
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
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é.
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.
Le moyen le plus simple de le faire est via la ligne de commande.
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.