在 emacs 中编辑 HTML 时,有没有一种方法可以自动对标记块进行漂亮格式化,改变如下:
<table>
<tr>
<td>blah</td></tr></table>
...进入这个:
<table>
<tr>
<td>
blah
</td>
</tr>
</table>
只要您处于 html 模式或 nxml 模式,您就可以在同一个区域/缓冲区上执行sgml-pretty-print
然后。indent-for-tab
sgml-pretty-print
在适当的位置添加新行并indent-for-tab
添加漂亮的缩进。它们共同导致格式正确的 html/xml。
默认情况下,当您.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
可以完成您的表格的宏。
http://www.delorie.com/gnu/docs/emacs/emacs_277.html
选择要修复的区域后。(要选择整个缓冲区,请使用 Cx h)
CMq
重新缩进一个括号分组(indent-sexp)中的所有行。
厘米-\
重新缩进区域中的所有行 (indent-region)。
我自己编写了一个函数来为 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))))
你可以做一个替换正则表达式
M-x replace-regexp
\(</[^>]+>\)
\1C-q-j
缩进整个缓冲区
C-x h
M-x indent-region
这个问题很老了,但我对各种答案并不满意。鉴于您正在运行相对较新版本的 emacs(我正在运行 24.4.1),重新缩进 HTML 文件的一种简单方法是:
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-mode
C-M-q
在我目前从源代码构建的 emacs 25 中,假设您处于 HTML 模式,请使用
Ctrl-x
h
全选,然后按Tab。
Tidy可以做你想做的事,但似乎只适用于整个缓冲区(结果是 XHTML)
M-x tidy-buffer
您可以使用以下方法将区域通过管道传输到 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
在命令行中输入。