7

我想使用适用于 emacs 的 Google 格式化功能重新格式化所有源文件:google-c-style.el(请参见此处)。

如何一次将此功能应用于我的所有源文件,以便它们都根据 Google 样式正确格式化和缩进?

4

4 回答 4

9

这有几个部分:

  • 你需要想出 EMACS 函数来做所有你想要的重新格式化。 indent-region是一个开始,但您可能还想取消制表符或其他一些事情。
  • 您需要在每个文件上调用它们,并且由于缩进函数适用于范围,因此您需要一个设置标记以覆盖整个文件的函数:mark-whole-buffer.
  • 您需要在每个文件上调用 EMACS:这意味着使用 --batch 文件调用 emacs。

这里这里有几篇关于这样做的不错的博客文章。

于 2009-04-04T14:46:27.457 回答
3

我之前通过使用键盘定义的宏来完成此操作。我会将所有文件加载到 emacs(类似find . -name "*.cpp" | xargs emacs)中,然后键入以下键。我已经用它的作用注释了每个组合键。

C-x-(                  'Begin recording macro
M-<                    'Go to start of file
C-space                'Mark current location (now start of file)
M->                    'Go to end of file
M-x indent-region      'Indent entire file according to coding style
C-x C-s                'Save the current buffer
C-x C-k                'Close the current buffer
C-x-)                  'End recording macro

现在您可以通过键入在缓冲区上运行它C-x e。如果你已经加载了几个文件,你可以运行类似C-u 100 C-x e在 100 个文件上运行的东西。如果这超过了文件的数量,那没关系,一旦所有处理完成,您只会收到一些“铃声”或其他可以忽略的错误。

于 2009-04-06T18:24:27.587 回答
2

我相信这个脚本不会重新格式化。相反,它是如何构建自定义“样式”的示例,如下所述:CC 模式手册 - 样式

CC模式手册还说:

如果您想重新格式化旧代码,您可能最好使用其他工具,例如 GNU indent,它具有比 CC 模式更强大的重新格式化功能。

CC 模式手册 - 限制和已知错误

于 2009-04-04T14:36:25.017 回答
0

如果您想在 dired 缓冲区中标记源文件,然后运行一个函数来格式化每个文件,您可以执行以下操作:

(defun clean-file(filename)
  (your-function-goes-here))

(defun clean-each-dired-marked-file() 
  (interactive)
  (for-each-dired-marked-file 'clean-file))

(defun for-each-dired-marked-file(fn)
 "Do stuff for each marked file, only works in dired window"
 (interactive)
 (if (eq major-mode 'dired-mode)
     (let ((filenames (dired-get-marked-files)))
       (mapcar fn filenames))
   (error (format "Not a Dired buffer \(%s\)" major-mode))))
于 2009-04-15T17:48:11.193 回答