72

在 emacs 中编辑 HTML 时,有没有一种方法可以自动对标记块进行漂亮格式化,改变如下:

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

...进入这个:

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

10 回答 10

109

只要您处于 html 模式或 nxml 模式,您就可以在同一个区域/缓冲区上执行sgml-pretty-print然后。indent-for-tab

sgml-pretty-print在适当的位置添加新行并indent-for-tab添加漂亮的缩进。它们共同导致格式正确的 html/xml。

于 2011-06-06T03:47:26.250 回答
30

默认情况下,当您.html在 Emacs(22 或 23)中访问文件时,它会将您置于html-mode. 那可能不是你想要的。你可能想要nxml-mode,这真是太棒了。nxml-mode似乎只随 Emacs 23 一起提供,尽管您可以从nXML 网站为早期版本的 emacs 下载它。还有一个名为nxml-mode. 您可以输入nxml-mode

M-x nxml-mode

您可以通过以下方式查看 nxml 模式文档:

C-h i g (nxml-mode) RET

话虽如此,您可能不得不使用Tidy之类的东西来重新格式化您的 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可以完成您的表格的宏。

于 2008-09-28T01:22:01.203 回答
14

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

选择要修复的区域后。(要选择整个缓冲区,请使用 Cx h)

CMq

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

厘米-\

重新缩进区域中的所有行 (indent-region)。

于 2008-09-26T00:38:48.837 回答
10

我自己编写了一个函数来为 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))))
于 2011-06-06T16:56:07.433 回答
8

你可以做一个替换正则表达式

 M-x replace-regexp

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

 \1C-q-j

缩进整个缓冲区

 C-x h
 M-x indent-region
于 2010-11-10T15:54:39.873 回答
8

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

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

这种方法的好处是它不需要任何插件(Conway 的建议),不需要替换正则表达式(nevcx 的建议),也不需要切换模式(jfm3 的建议)。Jay 的建议是朝着正确的方向——一般来说,执行C-M-q会根据模式的规则进行缩进——例如,C-M-q根据我的经验,在其他几种模式中js-mode以及在其他几种模式中都有效。但似乎html-mode也没有执行。nxml-modeC-M-q

于 2014-11-28T06:21:53.480 回答
7

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

全选,然后按Tab

于 2016-09-11T21:22:58.187 回答
6

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

M-x tidy-buffer
于 2008-09-26T03:56:01.560 回答
4

您可以使用以下方法将区域通过管道传输到 xmllint(如果有):

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

结果将最终出现在一个新的缓冲区中。

我使用 XML 执行此操作,并且它可以工作,尽管我相信 xmllint 需要某些其他选项来处理 HTML 或其他不完美的 XML。nxml-mode 会告诉您是否有格式正确的文档。

于 2011-09-15T19:28:23.700 回答
0

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

  • 确保您已 tidy 安装
  • 类型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在命令行中输入。

于 2012-06-13T17:22:40.850 回答