【问题标题】:Can emacs re-indent a big blob of HTML for me?emacs 可以为我重新缩进一大块 HTML 吗?
【发布时间】:2008-09-26 00:10:55
【问题描述】:

在 emacs 中编辑 HTML 时,有没有办法自动漂亮地格式化标记的 blob,改变如下:

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

...进入这个:

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

【问题讨论】:

  • 这在较新版本的 emacs 中要容易得多。这是向下滚动的情况。

标签: html emacs


【解决方案1】:

您可以在同一区域/缓冲区上执行sgml-pretty-print 然后indent-for-tab,前提是您处于 html 模式或 nxml 模式。

sgml-pretty-print 将新行添加到适当的位置,indent-for-tab 增加了漂亮的缩进。它们共同导致格式正确的 html/xml。

【讨论】:

  • 很好的答案。只要记住暂时切换到 sgml-mode 来运行 sgml-pretty-print。然后回到nxml-mode。
  • sgml-pretty-print 在 HTML 代码中为我工作,无需任何模式切换,谢谢!
  • 唯一真正有效的答案。我的意思是即使在无效的 XML 上(即只是 HTML 文件的一部分)。
【解决方案2】:

默认情况下,当您在 Emacs(22 或 23)中访问 .html 文件时,它会将您放入 html-mode。那可能不是你想要的。你可能想要nxml-mode,这真是太棒了。 nxml-mode 似乎只随 Emacs 23 一起提供,尽管您可以从 nXML web site 下载早期版本的 emacs。还有一个名为 nxml-mode 的 Debian 和 Ubuntu 软件包。您可以输入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 来处理您的表格。

【讨论】:

  • 进入 nxml-mode 后,我使用 C-x h 选择整个区域,然后 M-x 'indent-region'。您将获得正确缩进的 HTML。感谢 nxml-mode!
  • nxml-mode 不能正确缩进 html 片段,可能是因为它们没有 doctype。一旦您按照下面@nevcx 的建议插入换行符,html-mode 就可以正常工作
【解决方案3】:

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

选择要修复的区域后。 (要选择整个缓冲区,请使用 C-x h)

C-M-q

重新缩进一个括号分组中的所有行(indent-sexp)。

C-M-\

重新缩进区域中的所有行(缩进区域)。

【讨论】:

  • 这对我不起作用——在上面的例子中,C-M-q 什么都不做,而 C-M-\ 给出了完全不正确的缩进。
  • 在 nxml 模式下也不适用于我。 index-sexp 和 indent-region 将缩进已经有换行符的代码,这个例子缺少一些。
  • C-X h x 缩进区域
【解决方案4】:

我自己编写了一个函数来为 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))))

【讨论】:

  • 谢谢。我多年来一直想要这个!
  • 这其实是最简单最好的解决方案。我要经常用这个!谢谢!!!
  • 为我工作。感觉也是最简单的解决方案。非常喜欢
【解决方案5】:

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

 M-x replace-regexp

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

 \1C-q-j

缩进整个缓冲区

 C-x h
 M-x indent-region

【讨论】:

    【解决方案6】:

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

    • 在emacs中打开文件
    • C-x h 标记整个文件(注意:如果您想查看标记的内容,请将(setq transient-mark-mode t) 添加到您的.emacs 文件中)
    • 执行M-x indent-region

    这种方法的好处是它不需要任何插件(Conway 的建议),不需要替换正则表达式(nevcx 的建议),也不需要切换模式(jfm3 的建议)。 Jay 的建议是正确的——一般来说,执行 C-M-q 将根据模式的规则进行缩进——例如,根据我的经验,C-M-qjs-mode 和其他几种模式中有效。但是html-modenxml-mode 似乎都没有实现C-M-q

    【讨论】:

    • 很好的答案。两条线。完美地完成了所有工作!
    • 跟进问题,您的解决方案不会缩进 html 中的 javascript。你有什么简单快捷的解决方案吗?谢谢。
    • 如果换行符已经在正确的位置,则此方法有效。 sgml-pretty-print 对此有所帮助(但在我看来,仍然没有做出最佳选择)。
    【解决方案7】:

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

    全选,然后按Tab

    【讨论】:

      【解决方案8】:

      Tidy 可以做你想做的事,但似乎只适用于整个缓冲区(结果是 XHTML)

      M-x tidy-buffer
      

      【讨论】:

        【解决方案9】:

        您可以使用以下方法将区域通过管道传输到 xmllint(如果有的话):

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

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

        我使用 XML 执行此操作,并且它有效,但我相信 xmllint 需要某些其他选项来处理 HTML 或其他不完美的 XML。 nxml-mode 会告诉你是否有一个格式良好的文档。

        【讨论】:

        • 并带有前缀参数,shell-command-on-region 将原始区域替换为 shell 命令的输出。即:C-u M-|
        • 谢谢,菲尔斯,我知道有这个功能,但不记得如何调用它!
        【解决方案10】:

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

        • 确保你已经安装整齐
        • 输入tidy -i -m &lt;&lt;file_name&gt;&gt;

        注意-m 选项将新整理的文件替换为旧文件。如果你不想这样,你可以输入tidy -i -o &lt;&lt;tidied_file_name&gt;&gt; &lt;&lt;untidied_file_name&gt;&gt;

        -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 &lt;&lt;tidied_file_name&gt;&gt; &lt;&lt;untidied_file_name&gt;&gt;

        更多信息,只需在命令行输入man tidy

        【讨论】:

        • Afaiu,这是从 shell 调用的。我认为他希望在 emacs 中找到解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多