Emacs 能为我重新缩进一大块 HTML 吗?

在 emacs 中编辑 HTML 时,有没有一种方法可以自动对一个标记块进行美化格式化,比如:

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

变成这样:

<table>
<tr>
<td>
blah
</td>
</tr>
</table>
32517 次浏览

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

选择要修复的区域之后。(要选择整个缓冲区,使用 C-x h)

C-M-Q

对一个括号分组(indent-sexp)中的所有行进行缩进。

C-M-

缩进区域中的所有行(缩进区域)。

Tidy 可以做您想做的事情,但是它似乎只适用于整个缓冲区(结果是 XHTML)

M-x tidy-buffer

默认情况下,当您访问 Emacs (22或23)中的 .html文件时,它将把您放在 html-mode中。这可能不是你想要的。你可能想要 nxml-mode,这是非常高级的。nxml-mode似乎只与 Emacs 23一起出现,尽管您可以从 NXML 网站下载更早版本的 Emacs。还有一个名为 nxml-mode的 Debian 和 Ubuntu 软件包。你可以用以下连结输入 nxml-mode:

M-x nxml-mode

您可以使用以下命令查看 nxml 模式文档:

C-h i g (nxml-mode) RET

总之,您可能必须使用类似于 整洁的东西来重新格式化您的 xhtml 示例。nxml-mode会把你从

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

但是我没有看到一个更通用的工具来对某些 xml 标记执行断行操作。请注意,C-j将插入一个具有适当缩进的新行,因此您可以快速执行一个宏或者编写一个 defun来完成表。

您可以执行替换 regexp

 M-x replace-regexp


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


\1C-q-j

缩进整个缓冲区

 C-x h
M-x indent-region

如果处于 html 模式或 nxml 模式,那么可以在同一个区域/缓冲区上执行 sgml-pretty-printindent-for-tab

sgml-pretty-print在适当的位置添加了新的行,indent-for-tab添加了很好的缩进。

我自己为 xml 编写了一个函数,它在 nxml 模式下工作得很好。对于 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))))

您可以使用以下方法将一个区域通过管道传递给 xmllint (如果有的话) :

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

结果将以一个新的缓冲区结束。

我使用 XML 来完成这项工作,并且它能够工作,尽管我相信 xmllint 需要某些其他选项来处理 HTML 或其他不完美的 XML。Nxml-mode 将告诉您是否有格式良好的文档。

最简单的方法是通过命令行。

  • 确保安装整齐
  • 类型 tidy -i -m <<file_name>>

请注意,-m选项将新整理的文件替换为旧文件。如果你不想这样,你可以键入 tidy -i -o <<tidied_file_name>> <<untidied_file_name>>

-i用于缩进。或者,您也可以创建一个 .tidyrc文件,该文件具有如下设置

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

这样你所要做的就是键入 tidy -o <<tidied_file_name>> <<untidied_file_name>>

有关更多信息,请在命令行中键入 man tidy

这个问题很老了,但是我对各种各样的答案并不满意。考虑到您正在运行一个相对较新的 emacs 版本(我正在运行24.4.1) ,重新缩进 HTML 文件的一个简单方法是:

  • 在 emacs 中打开文件
  • C-x h标记整个文件(注意: 如果您希望看到正在标记的内容,请将 (setq transient-mark-mode t)添加到您的 .emacs文件中)
  • 执行 M-x indent-region

这种方法的优点在于它不需要任何插件(Conway 的建议) ,不需要替换 regexp (nevcx 的建议) ,也不需要切换模式(jfm3的建议)。Jay 的建议是正确的方向ーー一般来说,执行 C-M-q将根据模式的规则进行缩进ーー例如,根据我的经验,C-M-q可以在 js-mode和其他几种模式中工作。但是 html-modenxml-mode似乎都没有实现 C-M-q

在 emacs 25中(我目前正在从源代码构建) ,假设您处于 HTML 模式,请使用
Ctrl-x
h

选择所有,然后按 Tab