【问题标题】:Is it possible to format C++ code with VIM?是否可以使用 VIM 格式化 C++ 代码?
【发布时间】:2011-01-31 04:42:45
【问题描述】:

我对 VIM 比较陌生。我有一些源代码,这是一团糟。乍一看,我至少希望对代码有一个清晰而有条理的视图,所以我希望它的格式正确,我的意思是缩进取决于函数的深度等等。

我想知道是否可以使用 VIM 来完成,否则您可以推荐哪些其他命令行工具。

谢谢

【问题讨论】:

    标签: vim code-formatting


    【解决方案1】:

    有一个 vim 插件可以在 vim 中对您的代码进行格式化。它叫做 vim-autoformat,你可以在这里下载:

    https://github.com/vim-autoformat/vim-autoformat

    它将外部代码格式化程序集成到 vim 中。例如,如果要格式化C、C++、C#或Java代码,需要安装程序astyle,vim会自动设置为格式化程序。

    【讨论】:

      【解决方案2】:

      我现在强烈推荐 clang 格式。一旦安装了 clang-format,它就可以将 clang-format 简单地集成到 Vim 中:

      http://clang.llvm.org/docs/ClangFormat.html#vim-integration

      它是唯一真正懂你的C++代码的代码美化器,美化代码更像人而不是机器真的很聪明。例如:

      void TestFunction(int argument1, int argument2,
                        int argument3);
      void TestFunctionVeryLongName(int argument1,
                                    int argument2,
                                    int argument3);
      void TestFunctionWithRidiculouslyLongName(
          int argument1, int argument2, int argument3);
      

      【讨论】:

      • clang-format 手册中建议的键绑定的替代方法是在 vim 中使用 equalprg 绑定。这允许您使用G=gg 或其他= 缩进选项调用clang-format。只需将以下内容放入您的 .vimrc 文件中:autocmd FileType c,cpp setlocal equalprg=clang-format
      【解决方案3】:

      还有一个依赖clang-format的Vim插件:vim-clang-format

      然后您可以简单地将格式化命令映射到适合您的任何内容。

      【讨论】:

        【解决方案4】:

        只是必须解决这个确切的问题,所以我想我会为节省其他人一些时间做出贡献。

        您可以使用gg=G 缩进您的代码。但是,当您想要调整自动缩进的发生方式时,事情就变得难以理解了。因此,如果您只关心删除错误的空白而不真正关心格式样式,gg=G 是最快的方法,因为它是内置的。

        如果您确实想控制样式(例如,您试图使您的代码符合a style guide),那么您将需要一个外部工具来处理您的文件。你可以在 vim 中调用该工具::%!<toolname> <options>。这会将文件通过工具传输并重新加载处理后的结果。 (显然,您也可以将它用于您想要对文件执行的任何其他操作)

        那么下一个问题是,你应该选择什么外部工具?不管怎样,方法都是一样的:

        1. 安装选择的工具
        2. 确保它在您的路径中
        3. 在您的 vimrc 文件中添加一行,创建一个快捷键以便您节省时间
        4. 使用它。

        现在,您使用哪种工具取决于您要复制的风格。如果您尝试复制一种广泛使用的样式,那么您所需要的很可能是astyle

        如果您尝试复制自定义样式,则需要两件事:

        1. UniversalIndentGui - 一个前端,可让您使用各种选项并实时预览它们对源文件的影响
        2. 一组源代码格式化工具已安装并在您的路径中

        uncrustifygreatcode 之间,您应该能够完全复制您想要的样式。

        实际上,我撒谎了。还有另一种方法,称为clang-format。但是,您将需要阅读有关它的文档,并且它仍处于早期阶段,因此某些选项不能很好地工作。虽然它是一个漂亮的工具(绝对是最聪明的工具,因为它构建了代码的 AST),它甚至可用于 Windows。

        如果您打算花时间阅读手册,还想查看GNU Indent

        当然,还有最后一种方法,实际上是花时间学习 vim 的缩进规则并根据自己的风格编写一个。这需要时间,但它适用于gg=G

        关于 astyle vs uncrustify vs greatcode 的一些说明:

        1. Astyle 适用于一般格式,但不能很好地对齐变量的声明和重新设置 cmets 的样式。
        2. Uncrustify 可以做很多 astyle 做不到的事情,但要准备好花一个小时玩转,直到找到所需的正确选项组合。 (或者,如果您想浪费大量时间,请使用遗传算法找出适合您风格的最佳选项组合,并在您分享代码时给我一个链接,以便我也可以使用它:)

        请注意,您不必选择一种工具。使用 vim,您可以映射一个键击以连续执行多个命令,因此理论上您可以使用这些工具的组合来获得您正在寻找的内容。

        最后但同样重要的是,这是我的 .vimrc 文件的摘录,我在其中映射了 F12 以使用一些选项调用 astyle:

        "A2 = attached brackets
        "-s8 indent 8 spaces
        "-xc attached braces to class declarations
        "-xj remove braces for single statement ifs and elses
        "-c convert tabs to spaces in the non-indentation part of the line
        map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR>
        

        不要以风格来评判我。只需使用该工具重现您想要的内容。

        【讨论】:

          【解决方案5】:

          我不会写 C++ 代码,但我会写一些 Java 代码。

          相反,Vim 支持一些常用语言的格式。 我已经为我设置了一个快捷方式来格式化缓冲区中的整个代码。 它将返回到我刚刚编辑的行:)

          " format the file
          map <leader>fm gg=G'. 
          

          【讨论】:

            【解决方案6】:

            按照 m000 的思路,一个通用的解决方案是使用 UniversalIndentGUI 作为外部工具。

            【讨论】:

            • 感谢您的信息,但我更喜欢 VIM,因为我必须在远程机器上调试代码
            【解决方案7】:

            虽然 vim 是一把真正的瑞士刀,但对于某些工作,我仍然更喜欢外部工具。与使用内置等效方法相比,这种方法有时更直观、更容易记住。

            在缩进的情况下,我通过astyle过滤整个文件缓冲区。 astyle 参数在几分钟内更容易掌握,特别是如果您不是 vim 专家。此外,astyle 在微调输出方面提供了更大的灵活性。

            先安装astyle:
            # apt-get install astyle

            然后在vim里面:
            :%!astyle(简单的情况-astyle默认模式是C/C++)

            :%!astyle --mode=c --style=ansi -s2(ansi C++ 风格,每个缩进级别使用两个空格)

            :1,40!astyle --mode=c --style=ansi(ansi C++ 风格,仅过滤第 1-40 行)

            【讨论】:

            • 是否可以将其映射到 ctrl+shift+F 之类的组合键?
            • 您也可以通过将equalprg 设置为astyle(例如:set equalprg=~/astyle\ --style=google)来覆盖Vim 的缩进运算符(=)以使用Astyle(例如:set equalprg=~/astyle\ --style=google
            【解决方案8】:

            Vim 肯定会这样做,尽管结果可能并不完美:

            1. 首先,在可视模式下选择整个文件:ggVG
            2. 然后点击 = 重新缩进所有内容。

            你可以通过:help =了解更多关于equal命令的信息

            【讨论】:

              【解决方案9】:

              您可以执行以下操作:

              gg=G
              

              【讨论】:

              • 为了澄清,=[motion] 缩进运动所包含的区域。 gg 移动到文件的开头,G 移动到文件的末尾。
              • 或以V开始进入视觉线模式,然后用j向下移动以选择要格式化的所有行,然后点击=
              • 我不喜欢gg=G。为什么?因为当你用逗号(参数列表,长布尔值)打破长列表时,它会破坏手动对齐。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-06-26
              • 1970-01-01
              • 1970-01-01
              • 2010-10-25
              • 2011-04-16
              相关资源
              最近更新 更多