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

ral*_*ldi 66 html emacs

在emacs中编辑HTML时,有没有办法自动格式化一个标记blob,改变这样的事情:

  <table>
  <tr>
<td>blah</td></tr></table>
Run Code Online (Sandbox Code Playgroud)

......进入这个:

<table>
 <tr>
  <td>
   blah
  </td>
 </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

vav*_*ava 97

如果您处于html-mode或nxml-mode sgml-pretty-print,则可以执行indent-for-tab相同的区域/缓冲区.

sgml-pretty-print将新行添加到适当的位置并indent-for-tab添加漂亮的缩进.它们一起导致格式正确的html/xml.

  • 很好的答案.只记得暂时切换到sgml-mode来运行sgml-pretty-print.然后返回nxml-mode. (4认同)
  • `sgml-pretty-print`在没有任何模式切换的情况下从HTML中工作,谢谢! (4认同)
  • 谢谢!整个区域的快捷方式:ctrl + xh; 标签 (3认同)
  • 唯一真正有效的答案。我的意思是即使是无效的 XML(即只是 HTML 文件的一部分)。 (2认同)

jfm*_*fm3 28

默认情况下,当您访问.htmlEmacs(22或23)中的文件时,它会将您带入html-mode.这可能不是你想要的.你可能想要nxml-mode,这是非常花哨的.nxml-mode似乎只有Emacs 23才会出现,尽管您可以从nXML网站下载早期版本的emacs .还有一个名为Debian和Ubuntu的软件包nxml-mode.您可以输入nxml-mode:

M-x nxml-mode
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令查看nxml模式文档:

C-h i g (nxml-mode) RET
Run Code Online (Sandbox Code Playgroud)

总而言之,你可能不得不使用像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>
Run Code Online (Sandbox Code Playgroud)

<!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>
Run Code Online (Sandbox Code Playgroud)

但我没有看到一个更通用的工具,可以根据需要对某些xml标签进行换行.请注意,C-j将插入一个带有适当缩进的新行,这样您就可以执行快速宏或修改defun将执行表的操作.

  • 在我进入nxml-mode之后,我使用Cx h选择整个区域,然后使用Mx'indent-region'.您将获得正确的缩进HTML.感谢nxml模式! (10认同)
  • nxml-mode没有为html片段正确缩进,可能是因为它们没有doctype.一旦你得到@nevcx下面建议的换行符,html-mode就可以了 (2认同)

Jay*_*Jay 13

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

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

CMQ

重新围绕一个括号内的所有行(indent-sexp).

厘米-\

重新召集该地区的所有线路(缩进区域).

  • 这对我不起作用 - 在上面的例子中,CMq什么都不做,CM- \给出了完全不正确的缩进. (4认同)

jta*_*orn 10

我自己编写了一个函数来为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))))
Run Code Online (Sandbox Code Playgroud)


小智 8

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

 M-x replace-regexp

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

 \1C-q-j
Run Code Online (Sandbox Code Playgroud)

缩进整个缓冲区

 C-x h
 M-x indent-region
Run Code Online (Sandbox Code Playgroud)


abh*_*man 7

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

  • 在emacs中打开文件
  • 标记整个文件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.


Chr*_*way 6

整洁可以做你想要的,但只有整个缓冲区似乎(结果是XHTML)

M-x tidy-buffer
Run Code Online (Sandbox Code Playgroud)


Aar*_*all 6

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

选择全部,然后按Tab