2010-03-24 41 views
31

我对VIM比较陌生。我有一些源代码,这是一团糟。乍一看,我希望至少得到一个清晰和有组织的代码视图,所以我喜欢将它正确地格式化,我的意思是缩进取决于函数的深度等等。是否可以使用VIM格式化C++代码?

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

感谢

回答

58

而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)

+4

哇,这真的太棒了,非常感谢 – flow 2010-03-24 10:56:31

+0

是否有可能将此映射到像ctrl + shift + F这样的组合键? – 2014-03-27 12:00:55

+4

您也可以通过将'equalprg'设置为astyle(例如:'set equalprg =〜/ astyle \ --style = google')来覆盖Vim的缩进运算符('=')来使用Astyle – Parsa 2014-08-03 14:56:11

26

,你可以做到以下几点:

gg=G 
+1

为了说明,[运动]缩进了运动所包含的区域。 gg移动到文件的开头,G移动到文件的末尾。 – Sarah 2010-03-24 10:54:15

+1

或以'V'开始进入视觉线模式,然后用'j'向下移动以选择所有想要格式化的线,然后点击'=' – hasen 2010-03-26 07:40:42

+1

我不喜欢'gg = G'。为什么?因为当你用逗号(参数列表,长布尔值)打破长列表时,它会打破手动对齐。 – Benoit 2011-02-10 09:17:32

4

的Vim一定会做到这一点,虽然结果可能不是完美的:

  1. 首先,选择在视觉整个文件模式:ggVG
  2. 然后点击=重新开始一切。

您可以了解更多的平等命令::help =

1

沿着m000的想法提出的通用解决方案是使用UniversalIndentGUI作为外部工具。

+0

感谢您的信息,但我更喜欢VIM,因为我必须在远程机器上调试代码 – flow 2010-03-24 21:12:00

4

有一个vim插件,可以在vim中对你的代码进行格式化。这就是所谓的VIM,自动套用格式,你可以在这里下载:

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

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

2

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

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

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

就必须解决这一确切的问题,所以我想我会有助于挽救他人一段时间。

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

如果您确实想要控制样式(例如,您试图使代码符合a style guide),那么您将需要一个外部工具来处理您的文件。您可以从vim中调用该工具::%!<toolname> <options>。这通过工具管理文件并重新加载处理后的结果。 (你可以明显地用它来做任何你想对你的文件做的事情)

所以下一个问题是,你应该选择什么外部工具?无论如何,该方法是相同的:

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

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

如果你想复制自定义样式,那么您将需要两件事情:

  1. UniversalIndentGui - 前端,让你与各种选项和现场预览其效果源玩耍文件
  2. 一组安装源代码格式化工具,并在您的路径

之间uncrustifygreatcode,你应该能够完全复制你想要的风格。

其实我撒谎了。还有另外一种方法,它叫clang-format。然而,你会想要阅读它的文档,它仍然处于早期阶段,所以一些选项不能很好地工作。这是一个漂亮的工具(绝对是最聪明的,因为它构造了代码的AST),它甚至可以用于Windows。

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

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

的astyle上的一些注意事项VS uncrustify VS greatcode:

  1. 的astyle好于一般的格式,但不能做的事情一样排列的变量和重新风格的注释的声明非常好。
  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> 

不要评判我的风格。只需使用该工具重现你想要的。

13

现在我强烈推荐clang格式。它允许铛格式的简单集成到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); 
+1

在clang格式手册中建议的键绑定的另一种方法是在vim中使用'equalprg'绑定。这允许你用'G = gg'或其他'='缩进选项调用'clang-format'。 只需在你的'.vimrc'文件中加入以下内容: 'autocmd FileType c,cpp setlocal equalprg = clang-format' – Daniel 2016-10-27 02:24:46