在Emacs上漂亮地打印XML文件
我使用emacs编辑我的xml文件(nxml-mode),并且这些文件是由计算机生成的,没有任何漂亮的标记格式。
我已经搜索了漂亮的带有缩进的整个文件打印并保存了,但是找不到自动方式。
有办法吗?或者在Linux上至少有一些可以做到的编辑器。
解决方案
回答
当我要格式化和缩进XML或者HTML时,我使用nXML模式进行编辑和整理。还有一个Tidy的Emacs界面。
回答
整洁看起来像一个好模式。必须看看它。如果我真的需要它提供的所有功能,将使用它。
无论如何,这个问题困扰着我大约一个星期,而我的搜索不正确。发布后,我开始搜索并发现一个具有elisp功能的站点,它做得很好。作者还建议使用Tidy。
感谢回答Marcel(太糟糕了,我没有足够的积分来修饰我们)。
即将在我的博客上发布有关它的信息。这是有关它的文章(带有指向Marcel网站的链接)。
回答
- Emacs nxml-mode可以使用呈现的格式,但是我们必须分开行。
- 对于更长的文件,这根本不值得。针对较长的文件运行此样式表(最好是使用Saxon,IMHO可以使行缩进正确),以获取漂亮的打印效果。对于要保留空格的任何元素,请在" programlisting"旁边添加其名称,例如" programlisting yourElementName"
高温超导
回答
如果只需要缩进而不引入任何新的换行符,则可以通过以下击键将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这样的外部工具。
回答
我们甚至不需要编写自己的函数sgml-mode(一个gnu emacs核心模块)具有一个内置的漂亮打印函数,称为(sgml-pretty-print ...),该函数接受区域的开始和结束参数。
如果要剪切和粘贴xml,并且发现终端在任意位置剪切线,则可以使用此漂亮的打印机来首先修复虚线。
回答
恐怕我会更喜欢本杰明·法拉利(Benjamin Ferrari)版本。内部漂亮的打印件总是将结束标记放置在该值之后的新行中,从而在标记值中插入不必要的CR。
回答
Emacs可以使用M- |运行任意命令。如果我们安装了xmllint:
" M- | xmllint --format-"将格式化所选区域
" C-u M- | xmllint --format-"将执行相同的操作,将区域替换为输出
回答
感谢上面的蒂姆·赫尔姆施泰特,我做到了:
(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)))
快速简便。非常感谢。