我使用emacs的编辑我的xml文件(nxml模式)和该文件所产生的机没有任何相当的格式标签。

我已经搜查了为了漂亮的打印的整个文件与压痕和保存,但没有能够找到一种自动的方式。

有没有办法?或者至少一些编辑上的linux这可以做到这一点。

有帮助吗?

解决方案

我用 nXML模式 对于编辑和 整洁 当我想到的格式和缩进XML或HTML。还有 一个软件界面整理。

其他提示

你甚至不需要写你自己的功能sgml模式(一个gnu emacs的核心模块)具有建立在漂亮的打印功能称为(sgml-漂亮-印...)其需要的地区开始和结束的参数。

如果你被剪切和粘贴xml和你找到你的终端是砍线在任意的地方,你可以使用这个 漂亮的打印机 其修复的破碎的行第一次。

如果你只需要相当缩进没有引入任何新的线-休息,你可以应用的 indent-region 命令整个缓冲器与这些按键:

C-x h
C-M-\

如果你还需要引入线的休息时间,以便开始和结束标记是在单独行,可以使用以下非常好的工作基本是在封闭的情况下进行的功能,编写通过 本杰明*法拉利.我发现它,在他的博客,并希望这是确定对我来说现在这里:

(defun bf-pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
      (nxml-mode)
      (goto-char begin)
      (while (search-forward-regexp "\>[ \\t]*\<" nil t) 
        (backward-char) (insert "\n"))
      (indent-region begin end))
    (message "Ah, much better!"))

这并不依赖于外部工具,如整洁。

Emacs可以运行任何命令与M-|.如果你有xmllint安装:

"M-|xmllint--格式"格式的选区

"C-u M|xmllint--格式"将这样做,替代本地区输出

感谢蒂姆*黑尔姆施泰特的上述我的圣像这样:

(defun nxml-pretty-format ()
    (interactive)
    (save-excursion
        (shell-command-on-region (point-min) (point-max) "xmllint --format -" (buffer-name) t)
        (nxml-mode)
        (indent-region begin end)))

快速和容易的。非常感谢。

介绍行符然后漂亮的印刷

M-x sgml-mode
M-x sgml-pretty-print

这些调整我本杰明*法拉利的版本:

  • search-forward-regexp 没有指定一个结束,因此它运作上的东西从开始的地区结束的缓冲区(而不是结束的地区)
  • 现在递增 end 正确的,因为Cheeso注意。
  • 它将插入一间休息 <tag></tag>, ,它修改了它的价值。是的,技术上我们正在修改的价值观的一切都在这里,但是一个空的起点/终点是更有可能是显着的。现在使用两个独立的、略微更严格的搜查,以避免的。

还有的"不依靠外部整洁"、等。然而,它确实需要 clincf 宏。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; pretty print xml region
(defun pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    (goto-char begin)
    ;; split <foo><foo> or </foo><foo>, but not <foo></foo>
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))

这样的一种方法是 如果你有东西在下面的格式

<abc>     <abc><abc>   <abc></abc> </abc></abc>       </abc>

在Emacs的,试试

M-x nxml-mode
M-x replace-regexp RET  > *< RET >C-q C-j< RET 
C-M-\ to indent

这将缩进上述xml例如下面

<abc>
  <abc>
    <abc>
      <abc>
      </abc>
    </abc>
  </abc>
</abc>

在VIM你可以做这个的

:set ft=xml
:%s/>\s*</>\r</g
ggVG=

希望这会有所帮助。

  1. Emacs nxml模式可以工作,在提出格式,但你必须分割线。
  2. 对于较长的文件,仅仅是不值得的。运行这样式表(理想的是与撒克逊 这恕我直言,获得缩进行有关的权利)对较长的文件 得到一个不错漂亮的打印。任何元素,你想保留的空白 加入他们的姓名旁边'programlisting'作为'programlisting yourElementName'

禾田

我了 杰森Viers的版本 和加入的逻辑把在声明在他们自己的线。这假定你已经在=默认的中间没有空白。

(defun cheeso-pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    ;; split <foo><bar> or </foo><bar>, but not <foo></foo>
    (goto-char begin)
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    ;; put xml namespace decls on newline
    (goto-char begin)
    (while (search-forward-regexp "\\(<\\([a-zA-Z][-:A-Za-z0-9]*\\)\\|['\"]\\) \\(xmlns[=:]\\)" end t)
      (goto-char (match-end 0))
      (backward-char 6) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))

整洁的看起来像一个良好的模式。必须看待它。将使用它,如果我真的需要所有它提供的功能。

无论如何,这个问题是唠叨我大约一个星期我是不是寻找正确。发布后,我开始搜索和找到一个网站有一个 工作基本是在封闭的情况下进行功能 这不很好。提交人还建议使用洁。

谢谢你马歇尔回答 (太糟糕了,我没有足够的点upmod你).

将发布关于它的很快在我的博客。 这里是一个 发布关于它 (一个链接到马绍的网站)。

我用 xml-reformat-tagsxml的分析。el.通常你会想要点在本文件开始的时在运行这一命令。

有趣的是,该文件并入 Emacspeak.当我还是使用Emacspeak在每天的基础上,我想 xml-reformat-tags 是Emacs builtin.有一天我失去了它不得不作出一个互联网搜索,并因此进入了wiki网页上面提到的。

我还附上我的代码开始xml-分析。不知道,如果这是最好的片的软件代码,但似乎为我工作。

(if (file-exists-p "~/.emacs.d/packages/xml-parse.el")
  (let ((load-path load-path))
    (add-to-list 'load-path "~/.emacs.d/packages")
    (require 'xml-parse))
)

如果你使用 spacemacs, ,只是使用的命令'spacemacs/缩进区域或缓'.

M-x spacemacs/indent-region-or-buffer

我害怕我想本杰明*法拉利的版本好得多。内部漂亮的打印始的地方结束的标签,在一个新的线值后,插入不必要的CR在标记价值。

作为2017年emacs已经具有这种能力的默认,但你必须要写这个小的功能进入你的 ~/.emacs.d/init.el:

(require 'sgml-mode)

(defun reformat-xml ()
  (interactive)
  (save-excursion
    (sgml-pretty-print (point-min) (point-max))
    (indent-region (point-min) (point-max))))

那只是电话 M-x reformat-xml

资料来源: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top