【问题标题】:how to reformat files with an emacs script如何使用 emacs 脚本重新格式化文件
【发布时间】:2019-04-03 15:06:16
【问题描述】:

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

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

【问题讨论】:

    标签: xml emacs indentation


    【解决方案1】:

    第一步是编写一个重新格式化当前缓冲区的函数,就像您手动执行的那样。为此,您需要找出您键入的各种键序列所绑定的命令。 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 执行此操作。

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

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 2017-11-06
      • 1970-01-01
      • 2010-10-17
      • 2023-03-19
      • 2016-01-15
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多