Can emacs re-indent a big blob of HTML for me?

emacs, html

Solution

By default, when you visit a `.html` file in Emacs (22 or 23), it will put you in `html-mode`. That is probably not what you want. You probably want `nxml-mode`, which is seriously fancy. `nxml-mode` seems to only come with Emacs 23, although you can download it for earlier versions of emacs from the nXML web site. There is also a Debian and Ubuntu package named `nxml-mode`. You can enter `nxml-mode` with:

M-x nxml-mode

You can view nxml mode documentation with:

C-h i g (nxml-mode) RET

All that being said, you will probably have to use something like Tidy to re-format your xhtml example. `nxml-mode` will get you from

<!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>

to

<!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>

but I don't see a more general facility to do line breaks on certain xml tags as you want. Note that `C-j` will insert a new line with proper indentation, so you may be able to do a quick macro or hack up a `defun` that will do your tables.

Problem

When editing HTML in emacs, is there a way to automatically pretty-format a blob of markup, changing something like this: ``` <table> <tr> <td>blah</td></tr></table> ``` ...into this: ``` <table> <tr> <td> blah </td> </tr> </table> ```

Original source