在emacs中编辑HTML时,是否有一种自动美化标记的方法,可以将类似于以下这样的代码块自动转化为格式良好的形式:
<table>
<tr>
<td>blah</td></tr></table>
...变成这样:
<table>
<tr>
<td>
blah
</td>
</tr>
</table>
如果您处于html-mode或nxml-mode模式下,可以在同一区域/缓冲区上执行sgml-pretty-print
和indent-for-tab
操作。
sgml-pretty-print
将在适当的位置添加新行,而indent-for-tab
则添加漂亮的缩进。两者结合起来可以得到格式正确的html/xml。
sgml-pretty-print
对我在不切换模式的情况下从HTML文档中起到了作用。 - Ev Dolzhenko.html
文件时,它会将你放入html-mode
。这可能不是你想要的。你可能想用nxml-mode
,它非常高级。nxml-mode
似乎只有在Emacs 23中才附带,尽管你可以从nXML网站下载它以适用于更早的emacs版本。还有一个名为nxml-mode
的Debian和Ubuntu软件包。你可以使用以下命令进入nxml-mode
:M-x nxml-mode
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>
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>
但是我没有看到一个更通用的设施来对特定的XML标记进行换行,就像你想要的那样。请注意,C-j
将插入具有适当缩进的新行,因此您可以快速录制宏或编写defun
来处理表格。
http://www.delorie.com/gnu/docs/emacs/emacs_277.html
选择要修复的区域后(要选择整个缓冲区,请使用C-x h)。
C-M-q
重新缩进一个括号组中的所有行(indent-sexp)。
C-M-\
重新缩进区域中的所有行(indent-region)。
(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))))
C-x h
标记整个文件(注意:如果要查看正在标记的内容,请将(setq transient-mark-mode t)
添加到您的.emacs
文件中)M-x indent-region
C-M-q
将根据模式的规则进行缩进-例如,在我的经验中,C-M-q
适用于js-mode
和几种其他模式。但是,html-mode
和nxml-mode
似乎都没有实现C-M-q
。 M-x replace-regexp
\(</[^>]+>\)
\1C-q-j
整理整个缓冲区
C-x h
M-x indent-region
如果你安装了xmllint,你可以使用以下命令将一个区域(pipe a region)传递给它:
M-|
Shell command on region: xmllint --format -
shell-command-on-region
将用 shell 命令的输出替换原始区域。例如:C-u M-|
。 - phils最简单的方法是通过命令行完成。
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
。