是否可以使用VIM格式化C ++代码?

时间:2010-03-24 10:15:36

标签: vim code-formatting

我对VIM很新。我得到了一些源代码,这是一团糟。乍一看,我想至少得到一个清晰,有条理的代码视图,所以我喜欢正确格式化,我的意思是缩进取决于函数的深度等等。

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

由于

9 个答案:

答案 0 :(得分:59)

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

在缩进的情况下,我通过astyle过滤整个文件缓冲区。 astyle参数在几分钟内更容易掌握,特别是如果你不是vim guru的话。此外,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行)

答案 1 :(得分:27)

您可以执行以下操作:

gg=G

答案 2 :(得分:13)

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

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

它是唯一能够真正理解您的C ++代码的代码美化器,它非常智能地将代码美化为更像人而不是机器。 E.g:

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

答案 3 :(得分:4)

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

  1. 首先,以可视模式选择整个文件:ggVG
  2. 然后点击=重新获得一切。
  3. 您可以通过以下方式了解有关平等命令的更多信息::help =

答案 4 :(得分:4)

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

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

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

我不编写C ++代码,但是我编写了一些Java代码。

相反,Vim支持某些常用语言的格式化。 我为我设置了一个捷径,以便在缓冲区中格式化整个代码。 它将返回我刚编辑的那一行:)

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

答案 7 :(得分:1)

根据m000的想法,通用解决方案是使用UniversalIndentGUI作为外部工具。

答案 8 :(得分:0)

只需解决这个确切的问题,所以我想我会为拯救他人一些时间做出贡献。

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

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

接下来的问题是,您应该选择哪种外部工具?无论如何,方法是相同的:

  1. 安装首选工具
  2. 确保它在你的路径中
  3. 在你的vimrc文件中添加一行,创建一个快捷键,以便节省时间
  4. 使用它。
  5. 现在,您使用的工具取决于您尝试复制的样式。如果你试图复制一种广泛使用的风格,那么astyle就是你所需要的。

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

    1. UniversalIndentGui - 一个前端,可以让你玩各种选项并在源文件中实时预览它们的效果
    2. 在路径中安装了一组源代码格式化工具
    3. uncrustifygreatcode之间,您应该能够完全复制所需的样式。

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

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

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

      关于astyle vs uncrustify vs greatcode的一些注释:

      1. Astyle适用于一般格式化,但不能做很好的事情,例如调整变量声明和重新设置注释。
      2. Uncrustify可以做很多astyle不能的东西,但是要准备好花一个小时玩,直到找到你需要的正确选项组合。 (或者,如果您想浪费大量时间,请使用遗传算法为您的风格找出最佳选项组合,当您共享代码并给我链接时,我也可以使用它:))
      3. 请注意,您不必选择一个工具。使用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>
        

        不要在风格上评判我。只需使用该工具即可重现您想要的内容。