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

时间:2019-04-03 15:06:16

标签: xml emacs indentation

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

我尝试使用python脚本中的Element.tail正确使缩进,但无法正确进行。

1 个答案:

答案 0 :(得分:2)

第一步是编写一个重新格式化当前缓冲区的函数,这是您手动执行的方法。为此,您需要找出您键入的各种按键序列所绑定的命令。 C-h c可用于此目的,例如键入C-h c C-x h会告诉您绑定到的命令是mark-whole-buffer。完成此操作后,编写一个自动执行序列的函数很容易:

(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 reformat-files执行此操作。

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