【发布时间】:2010-10-17 13:26:51
【问题描述】:
我想使用适用于 emacs 的 Google 格式化功能重新格式化我的所有源文件:google-c-style.el(请参阅 here)。
如何一次将这个函数应用到我的所有源文件,以便它们都按照 Google 样式正确格式化和缩进?
【问题讨论】:
标签: emacs lisp elisp code-formatting
我想使用适用于 emacs 的 Google 格式化功能重新格式化我的所有源文件:google-c-style.el(请参阅 here)。
如何一次将这个函数应用到我的所有源文件,以便它们都按照 Google 样式正确格式化和缩进?
【问题讨论】:
标签: emacs lisp elisp code-formatting
我相信这个脚本不会重新格式化。相反,它是如何构建自定义“样式”的示例,如下所述:CC mode manual - Styles
CC模式手册还说:
如果您想重新格式化旧代码,最好使用其他工具,例如GNU 缩进,它具有比 CC 模式更强大的重新格式化功能。
【讨论】:
我以前通过使用键盘定义的宏来完成此操作。我会将所有文件加载到 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 个文件上运行它。如果这超过了文件的数量,那没关系,您只会收到一些“铃声”或其他可以在所有处理完成后忽略的错误。
【讨论】:
如果您想在 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))))
【讨论】: