emacs能为我重新缩进一大堆HTML吗?

在emacs中编辑HTML时,有没有办法自动地格式化一个标记blob,改变如下所示:

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

…进入这个:

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

默认情况下,当您访问Emacs(22或23)中的.html文件时,它将使您进入html-mode 。 这可能不是你想要的。 你可能需要nxml-mode ,这是非常花哨的。 尽pipe可以从nXML网站下载emacs的早期版本,但是nxml-mode似乎只能使用Emacs 23。 还有一个名为nxml-mode的Debian和Ubuntu软件包。 您可以inputnxml-mode

 Mx nxml-mode 

您可以查看nxml模式文档:

 Ch ig (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标签的换行符,如你所愿。 请注意, Cj会插入一个新的符合正确缩进的行,所以你可能会做一个快速macros或破解一个defun ,将做你的表。

如果您处于html模式或nxml模式,您可以在相同的区域/缓冲区上执行sgml-pretty-print然后indent-for-tab

sgml-pretty-print将新行添加到适当的位置,并且indent-for-tab添加了很好的缩进。 他们一起导致格式正确的HTML / XML。

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

select您想要修复的区域后。 (要select整个缓冲区使用Cx h)

CMQ

重写一个括号内的所有行(indent-sexp)。

厘米-\

重新注册该地区的所有行(缩进地区)。

我自己写了一个函数来做这个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<" tt)) (goto-char beg) (indent-region beg end nil)))) 

你可以做一个replace正则expression式

  Mx replace-regexp \(</[^>]+>\) \1C-qj 

缩进整个缓冲区

  Cx h Mx indent-region 

整洁可以做你想做的,但只看到整个缓冲区(结果是XHTML)

 Mx tidy-buffer 

您可以使用以下命令将一个区域传递给xmllint(如果有的话):

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

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

我使用XML来完成这个工作,虽然我相信xmllint需要某些其他选项来处理HTML或其他不完美的XML。 nxml模式会告诉你,如果你有一个格式良好的文件。

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

  • 在emacs中打开文件
  • 使用Cx h标记整个文件(注意:如果您想查看正在标记的内容,请将(setq transient-mark-mode t).emacs文件中)
  • 执行Mx indent-region

这种方法的好处在于它不需要任何插件(Conway的build议),它不需要replaceregexp(nevcx的build议),也不需要切换模式(jfm3的build议)。 周杰伦的build议是正确的 – 一般来说,执行CMq会按照模式的规则缩进 – 例如, CMq在我的经验, js-mode和其他几种模式下工作。 但是html-modenxml-mode都不能实现CMq

在emacs 25中,我目前正在从源代码构build,假设您处于HTML模式,请使用
Ctrlx
H

select全部,然后按Tab键

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

  • 确保你已经安装好了
  • 键入tidy -i -m <<file_name>>

请注意, -m选项会将新整理的文件replace为旧的文件。 如果你不想要,你可以inputtidy -i -o <<tidied_file_name>> <<untidied_file_name>>

-i是缩进。 或者,您可以创build一个.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 

这样你所要做的就是inputtidy -o <<tidied_file_name>> <<untidied_file_name>>

只需在命令行inputman tidy