在emacs中,我将文件格式化为: 1)C-x h(或M-x标记 - 整个缓冲区) 2)C-M- \(或M-x缩进区域)
我需要帮助告诉我如何格式化目录下的所有文件?
答案 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 )中打开目录,然后:
bury-buffer
掩埋缓冲区。你将回到直接缓冲区。所以现在你有了一个宏来打开当前行上的文件,格式化它,回退到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
,保存缓冲区然后将其杀死。