【问题标题】:How can I apply a new Emacs C style to reformat all my source files?如何应用新的 Emacs C 样式来重新格式化所有源文件?
【发布时间】:2010-10-17 13:26:51
【问题描述】:

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

如何一次将这个函数应用到我的所有源文件,以便它们都按照 Google 样式正确格式化和缩进?

【问题讨论】:

    标签: emacs lisp elisp code-formatting


    【解决方案1】:

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

    CC模式手册还说:

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

    CC mode manual - Limitations-and-Known-Bugs

    【讨论】:

    • 是的,所以我想加载样式并应用缩进缓冲区功能。然后对所有文件执行此操作。
    • 重新缩进,是的。重新格式化,没有。例如,大括号之前/之后的换行符不会改变。
    • 我的建议是你使用 indent 而不是 emacs。
    • 但是使用缩进,我不能使用定义我需要的所有格式的 emacs 样式文件...?
    【解决方案2】:

    这有几个部分:

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

    herehere 有几篇不错的博客文章。

    【讨论】:

    • 很遗憾,博客文章的链接现已失效。
    • 博文又坏了。互联网档案馆发现了一个重定向到另一个有效的域。当前链接为herehere
    【解决方案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 个文件上运行它。如果这超过了文件的数量,那没关系,您只会收到一些“铃声”或其他可以在所有处理完成后忽略的错误。

    【讨论】:

      【解决方案4】:

      如果您想在 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))))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2020-10-28
        • 2016-08-26
        • 1970-01-01
        相关资源
        最近更新 更多