如何格式化emacs中dir下的所有文件?

时间:2010-03-31 09:08:09

标签: emacs

在emacs中,我将文件格式化为: 1)C-x h(或M-x标记 - 整个缓冲区) 2)C-M- \(或M-x缩进区域)

我需要帮助告诉我如何格式化目录下的所有文件?

4 个答案:

答案 0 :(得分:10)

这是另一种方法:

首先,在*scratch*缓冲区中评估此函数定义:

(defun indent-marked-files ()
  (interactive)
  (dolist (file (dired-get-marked-files))
    (find-file file)
    (indent-region (point-min) (point-max))
    (save-buffer)
    (kill-buffer nil)))

接下来,在要更改所有文件的目录顶层打开一个Dired缓冲区。给dired命令一个数字前缀,以便它要求交换机提供ls命令,并添加R(递归)开关: Cu Cx d R RET your-directory RET

接下来,标记递归目录列表中的所有常规文件:首先 * / 标记所有目录,然后 * t 切换选择。

最后,运行以上命令: M-x indent-marked-files

请注意,如果您已经有任何缓冲区访问任何目标文件,它们将被indent-marked-files杀死。另请注意,所有文件更改都不可撤消;谨慎使用!我在一个简单的案例中对它进行了测试,它似乎按照描述的方式工作,但我不做任何保证。

答案 1 :(得分:8)

创建一个宏来执行此操作。在dired( C-x d )中打开目录,然后:

  1. 将点放在第一个文件上。
  2. F3 开始录制宏。
  3. 点击 RET 打开文件。
  4. 使用 C-x h C-M - \ 对其进行格式化。
  5. M-x bury-buffer掩埋缓冲区。你将回到直接缓冲区。
  6. 走一行。
  7. F4 停止录制宏。
  8. 所以现在你有了一个宏来打开当前行上的文件,格式化它,回退到dired,并指向下一行。根据需要多次使用 F4 运行它。

答案 2 :(得分:1)

你可以试试这个:

(defun format-all-files (regexp)
  "Format multiple files in one command."
  (interactive "sFind files matching regexp (default all): ")
  (when (string= "" regexp) (setq regexp ""))
  (let ((dir (file-name-directory regexp))
        (nodir (file-name-nondirectory regexp)))
    (when dir (cd dir))
    (when (string= "" nodir) (setq nodir "."))
    (let ((files (directory-files "." t nodir nil t))
          (errors 0))
      (while (not (null files))
        (let ((filename (car files)))
          (if (file-readable-p filename)
              (progn 
                (set-buffer (find-file-noselect filename))
                (mark-whole-buffer)
                (indent-region-or-balanced-expression)
                (save-buffer)
                (kill-buffer (current-buffer)))
            (incf errors))
          (setq files (cdr files))))
      (when (> errors 0)
        (message (format "%d files were unreadable." errors))))))

但请注意,这必须一遍又一遍地加载特定于文件的模式,这可能涉及语法突出显示或在该类型的负载上发生的任何初始化。对于非常大的格式化作业,批量程序(例如indent 缩进)会更快。

答案 3 :(得分:0)

我回答这个问题很晚,但这仍然是Google的第一个结果。

我改进了 @Sean 的答案,以消除对复杂的Dired交互的需求。

(defun my/indent-files (directory extension)
    (interactive (list (read-directory-name "Directory: ")
                       (read-string "File extension: ")))
    (dolist (file (directory-files-recursively directory extension))
        (find-file file)
        (indent-region (point-min) (point-max))
        (save-buffer)
        (kill-buffer nil)))

使用示例:先按M-x my/indent-files然后按~/Dropbox然后按.org

这将在所有 indent-region个文件上运行.org,保存缓冲区然后将其杀死。