【问题标题】:Google c style settings for gnu indent?gnu缩进的Google c样式设置?
【发布时间】:2013-06-13 05:33:11
【问题描述】:

我在 Emacs (google-c-style.el) 和 Vim(google.vim) 中使用 google c 缩进样式。

但是因为我有一些现有的代码不是这种风格,我希望我可以改变它。我发现有一个名为 GNU indent 的工具可以自动执行此类操作,它在 this page 上提供了一些常见的样式设置,但是 Google c 缩进样式没有。那么它也有等价物吗?

(我试过Linux和Berkley的风格,觉得对我来说一点都不满意)

【问题讨论】:

    标签: c++ c coding-style indentation


    【解决方案1】:

    作为记录,对于那些对 Clang 和 LLVM 感兴趣的人来说,有一个替代解决方案。

    clang-format 绝对可以帮助轻松高效地格式化现有源代码。它显式内置支持 5 种格式,即LLVM(默认)、GoogleChromiumMozillaWebKit

    使用 Google 样式格式化文件的简单方法是:

    clang-format -style=Google -i filename
    

    其中-i 表示就地修改,您可以尝试不使用此选项来预览更改。

    要批量格式化现有的 C/C++ 代码,我们可以简单地使用如下命令:

    find . -name "*.cc" | xargs clang-format -style=Google -i
    

    除了上面列出的5种格式之外,其实还有其他样式,比如GNU(添加到revision 197138;可惜文档没有同步)。

    请注意,clang-format 在项目中接受名为 .clang-format_clang-format 的类 rc 文件,这是添加此类配置文件的最简单方法(如在clang-format的官方教程页面中说)是转储现有格式的配置,例如:

    clang-format -style=Google -dump-config >.clang-format
    

    您也可以使用BasedOnStyle 选项,因此配置文件可能如下所示:

    ---
    BasedOnStyle:  Chromium
    PointerBindsToType: false
    ObjCSpaceAfterProperty: true
    ...
    

    使用.clang-format_clang-format作为关键词在Github上搜索,还有其他示例;或者您可以参考this site 来帮助构建一个。

    还集成了 IDE/编辑器,例如 Visual Studio(在目录 clang-format-vs)、Sublime、Emacs、Vim(都在目录 clang-format)。

    另外 3 个提示:

    1. 对于 Emacs 集成(clang-format.el),我个人认为最好为clang-format-buffer 绑定密钥而不是clang-format-region

    2. 对于Mac OSX homebrew 安装,使用brew install --with-clang, --with-lld, --with-python --HEAD llvm 可以获得clang-format 的支持,它的集成文件在$(brew --cache)/llvm--clang--svn-HEAD/tools/clang-format(奖励:那里甚至还有一个git-clang-format!!)。

    3. clang-extra-tools 内还有其他精彩工具,例如 clang-modernize(用于“自动转换针对旧标准编写的 C++ 代码以使用最新 C++ 标准的功能,其中合适”),真的值得一试!

    【讨论】:

      【解决方案2】:

      简要阅读google编码风格,主要是K&R编码风格,除了有2个空格缩进(包括case语句),80列行,没有制表符。因此,以下选项应该可以实现:

      -kr -ci2 -cli2 -i2 -l80 -nut
      

      从那开始。您可能需要调整生成的代码。对于indent,C++ 支持尤其薄弱。

      传说:

      • -kr:K&R风格
      • -ci2:继续缩进,多行代码语句第一行之后的行缩进2个空格
      • -cli2:大小写标签缩进,case 标签从 switch 缩进 2 个空格
      • -i2:缩进,2个空格
      • -l80:长度,80 列
      • -nut: 没有标签

      作为替代方案,您可以考虑为您的代码添加executing emacs in batch mode to apply indentation。简要说明:

      创建一个名为emacs-format-file 的文件,内容如下:

      (defun emacs-format-function ()
         "Format the whole buffer."
         (c-set-style "Google")
         (indent-region (point-min) (point-max) nil)
         (untabify (point-min) (point-max))
         (save-buffer))
      

      从 shell 执行以下命令:

      emacs -batch your_source_file.c \
          -l emacs-format-file -f emacs-format-function
      

      【讨论】:

      • 似乎 GNU 缩进存在一些缺陷,因为我发现它在 C++ 模板中效果不佳。
      • 是的,我注意到 C++ 对缩进的支持很弱。但是,我提供了另一种在批处理模式下使用 emacs 的方法。
      • 我明白了。但是 Emacs 内置函数不能生成空格,这有点令人沮丧;并且在应用GNU indent 时,Emacs 也会做一些小改动(我猜是后者的问题)。
      • 如果您的意思是使用空格而不是制表符,请将(setq indent-tabs-mode nil) 添加到您的c-mode-hook
      • 通过说空格,我包括空白、制表符和换行符。我的意思是 Emacs 内置函数不能插入那些来精确格式化代码(例如,我希望函数定义和它的主体之间有一个换行符,或者我希望字符和右括号之间有一个空格, GNU 缩进有效,但在 Emacs/Vim 中没有好办法。)
      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多