Xml 如何使用emacs脚本重新格式化文件

Xml 如何使用emacs脚本重新格式化文件,xml,emacs,indentation,Xml,Emacs,Indentation,我有大量由python脚本生成的XML文件。缩进不是应该的,我在Emacs中打开文件,C-x h,选项卡,C-x C-s,C-x k。 有没有办法编写脚本?换句话说,我想使用emacs选项卡,它缩进文件夹中所有XML文件的整个选择 我尝试在python脚本中使用Element.tail来正确缩进,但未能正确缩进。第一步是编写一个函数,以手动方式重新格式化当前缓冲区。为此,您需要找出您键入的各种键序列绑定到的命令C-hc可用于此,例如,键入C-hc-xh告诉您它绑定到的命令是标记整个缓冲区。完成此

我有大量由python脚本生成的XML文件。缩进不是应该的,我在Emacs中打开文件,
C-x h
选项卡
C-x C-s
C-x k
。 有没有办法编写脚本?换句话说,我想使用emacs选项卡,它缩进文件夹中所有XML文件的整个选择


我尝试在python脚本中使用Element.tail来正确缩进,但未能正确缩进。

第一步是编写一个函数,以手动方式重新格式化当前缓冲区。为此,您需要找出您键入的各种键序列绑定到的命令
C-hc
可用于此,例如,键入
C-hc-xh
告诉您它绑定到的命令是
标记整个缓冲区
。完成此操作后,编写一个函数以自动执行序列就很容易了:

(defun reformat-buffer ()
   "Reformat the current buffer"
   (interactive)
   (mark-whole-buffer)
   (indent-for-tab-command)
   (save-buffer))
您可以将该函数绑定到某个键序列,但由于我将在另一个循环文件的函数中使用该函数,所以我不想麻烦。我在这里也不包括
(kill buffer)
(绑定到
C-x k
的函数),因为我将在循环函数中使用临时缓冲区

下一步是循环所有文件。你没有给出任何关于文件是如何组织的信息,所以我将做一个假设,以便写下一些具体的东西:根据文件是如何组织的,你可能需要修改这个

我假设所有文件都在一个目录中,并且有一个
.xml
后缀。 然后,我们可以执行相当于
ls*.xml
的操作,以获取所有要操作的文件:

(defun reformat-files ()
   "Loop over all the files with suffix `.xml' in the current directory
    and apply the reformat-buffer function to each of them."
   (interactive)
   (dolist (file (directory-files "." nil "\.xml$")
      (with-temp-buffer
         (find-file file)
         (reformat-buffer))))
假设您在正确的目录中(确保使用
M-x cd
),您可以使用
M-x重新格式化文件执行此操作

这里没有任何错误处理,也没有任何保证:确保您拥有任何无法轻松重新生成的文件的副本