Emacs 打开运行命令保存退出

Emacs open run command save exit

我在 Emacs 中对 C/C++ 项目使用 google-c-style.el。与许多 Emacs 模式一样,缩进是自动设置的。对于任何给定的文件,我可以打开它,select 整个文档,然后按 Tab 键重置所有缩进,保存,然后退出。

我有一个大型代码库,我想对其执行此过程,但我想从命令行或 shell 脚本自动执行此操作。完成此任务的最佳方法是什么?假设我已经找到了我想要 运行 的文件列表。

我还没有看到任何自动执行此操作的程序包。但是,我已经使用下面的模式来完成特定任务。您必须实现执行该工作的实际函数,在此示例中 (my-do-something).

(defun my-do-something-file (f)
  (let ((buf (get-file-buffer f))
        (kill-it nil))
    (unless buf
      (setq buf (find-file-noselect f))
      (setq kill-it t))
    (save-excursion
      (set-buffer buf)
      (unless buffer-read-only
        (my-do-something)    ;; Implement this.
        (let ((require-final-newline nil))
          (save-buffer))))
    (when kill-it
      (kill-buffer buf))))


(defun my-do-something-directory (dir)
  (interactive "DDirectory: ")
  (dolist (f (directory-files dir t))
    (if (not (member (file-name-nondirectory f) '("." ".." ".svn")))
        (if (file-directory-p f)
            (my-do-something-directory f)
          (my-do-something-file f)))))

Emacs batch mode 是这个问题的正确答案(感谢@lawlist)。 link 甚至还有一个 "indenting C files" 示例。

emacs --batch sample.cpp \
    --eval '(indent-region (point-min) (point-max) nil)' \
    -f save-buffer

根据 Emacs documentation,--batch 开关意味着 --no-init-file 使 Emacs 无法加载您的自定义配置。结果,我的缩进只是默认 C++ 模式的缩进,而不是我想要的 google-c-style。解决方案是告诉 Emacs 在打开文件之前加载您的设置文件。

emacs --load ~/.emacs.d/init.el \
    --batch sample.cpp \
    --eval '(indent-region (point-min) (point-max) nil)' \
    -f save-buffer

您还可以创建一个 Emacs 脚本,并 运行 它在一组文件上,如图 here