在emacs中编辑HTML时,有没有一种方法可以自动漂亮地格式化标记的blob,并进行如下更改:
<table>
<tr>
<td>blah</td></tr></table>
...变成这样:
<table>
<tr>
<td>
blah
</td>
</tr>
</table>
Answers:
默认情况下,当您.html
在Emacs(22或23)中访问文件时,它将进入html-mode
。那可能不是您想要的。您可能想要nxml-mode
,这真是太花哨了。nxml-mode
似乎仅随Emacs 23一起提供,尽管您可以从nXML网站上下载它以用于早期版本的emacs 。还有一个名为的Debian和Ubuntu软件包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
将用于表的内容。
如果您处于html模式或nxml模式sgml-pretty-print
,则可以indent-for-tab
在相同的区域/缓冲区上执行操作。
sgml-pretty-print
在适当的位置添加新行,并indent-for-tab
添加漂亮的缩进。它们一起导致正确格式化的html / xml。
sgml-pretty-print
从HTML wode为我工作,没有任何模式切换,谢谢!
http://www.delorie.com/gnu/docs/emacs/emacs_277.html
选择要修复的区域后。(要选择整个缓冲区,请使用Cx h)
q
重新缩进一个括号组(indent-sexp)中的所有行。
厘米-\
重新缩进该区域(缩进区域)中的所有行。
我自己编写了一个函数来针对xml进行此操作,该功能在nxml-mode下运行良好。对于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))))
这个问题已经很老了,但是我对各种各样的答案并不满意。考虑到您正在运行相对较新版本的emacs(我正在运行24.4.1),一种重新缩进HTML文件的简单方法是:
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-mode
也nxml-mode
没有实现C-M-q
。
最简单的方法是通过命令行。
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
,请在命令行中键入。