当前位置:  开发笔记 > 编程语言 > 正文

在Emacs上打印漂亮的XML文件

如何解决《在Emacs上打印漂亮的XML文件》经验,为你挑选了8个好方法。

我使用emacs编辑我的xml文件(nxml-mode),并且机器生成的文件没有任何漂亮的标签格式.

我已经搜索了使用缩进打印整个文件并保存它,但无法找到自动方式.

有办法吗?或者至少有一些Linux编辑可以做到这一点.



1> 小智..:

你甚至不需要编写自己的函数 - sgml-mode(一个gnu emacs核心模块)有一个内置的漂亮的打印函数(sgml-pretty-print ...),它接受区域的开始和结束参数.

如果你正在切割和粘贴xml,你发现你的终端正在任意位置切断线,你可以使用这个漂亮的打印机,先修复断线.


我不确定`sgml-mode`可能会随着时间的推移而改变.今天,我调用`CX比照foo.xml`,`的Mx的SGML mode`,然后`的Mx的SGML漂亮,print`和我的XML文件中得到了相当打印.(好吧,emacs在完成之前被吊死了20秒或更长时间.这是漂亮的打印之前的一行文件和之后的720行.)
我什至不必切换到sgml-mode。这是nXML模式下的Mx命令!

2> Christian Be..:

如果您只需要非常缩进而不引入任何新的换行符,则可以indent-region使用以下键击将命令应用于整个缓冲区:

C-x h
C-M-\

如果你还需要引入换行符,那么打开和关闭标签在不同的行上,你可以使用由Benjamin Ferrari编写的以下非常好的elisp函数.我在他的博客上找到了它,并希望我可以在这里重现它:

(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!"))

这不依赖于像Tidy这样的外部工具.



3> 小智..:

Emacs可以使用M- |运行任意命令.如果您安装了xmllint:

"M- | xmllint --format - "将格式化所选区域

"Cu M- | xmllint --format - "也会这样做,用输出替换该区域



4> Marcel Levy..:

当我想格式化和缩进XML或HTML时,我使用nXML模式进行编辑和整理.Tidy还有一个Emacs接口.



5> bubak..:

感谢上面的Tim Helmstedt,我做了这样的事情:

(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)))

快速而简单.非常感谢.


这给了我一个关于GNU Emacs 24的错误,所以我把最后一行改为:`(缩进区域0(count-lines(point-min)(point-max)))

6> Talespin_Kit..:

用于引入换行符然后漂亮的打印

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



7> Jason Viers..:

这是我对Benjamin Ferrari的版本做的一些调整:

search-forward-regexp没有指定一个结束,所以它会在东西运营从区域的开始到缓冲区的末尾(而不是区域的结束)

end正如Cheeso指出的那样,现在正确递增.

它会在它们之间插入一个中断,从而修改它的值.是的,从技术上讲,我们在这里修改一切的价值,但空的开始/结束更有可能是重要的.现在使用两个单独的,稍微严格的搜索来避免这种情况.

仍然有"不依靠外部整洁",等等.但是,它需要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  or , but not 
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split  and 
    (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!"))



8> user1028948..:

一种方法是如果您有以下格式的东西

                

在Emacs中,试试吧

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

这将在xml示例上面缩进到下面


  
    
      
      
    
  

在VIM中你可以做到这一点

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

希望这可以帮助.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有