如何应用新的Emacs C样式来重新格式化所有源文件?

时间:2009-04-04 14:22:20

标签: emacs lisp elisp code-formatting

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

如何将此功能同时应用于我的所有源文件,以便根据Google风格对它们进行全部格式化和缩进?

4 个答案:

答案 0 :(得分:9)

这有几个部分:

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

有关此herehere的一些不错的博客文章。

答案 1 :(得分: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个文件上运行此文件。如果这超过了文件的数量,那就没问题了,一旦完成所有处理,你就会得到一些“响铃”或其他错误。

答案 2 :(得分:2)

我相信这个脚本不会重新格式化。相反,它是如何构建自定义“样式”的示例,如:CC mode manual - Styles

中所述

CC模式手册也说:

  

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

CC mode manual - Limitations-and-Known-Bugs

答案 3 :(得分:0)

如果你想在一个直接缓冲区中标记源文件,然后运行一个函数来格式化每个文件,你可以这样做:

(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))))