我如何在vim中自动格式化/缩进C代码?

当我从另一个文件复制代码时,格式化会搞砸,如下所示:

fun() { for(...) { for(...) { if(...) { } } } } 

我怎样才能自动在vim这个代码?

尝试以下击键:

 gg=G 

说明: gg进入文件的顶部, =是一个固定缩进的命令, G告诉它执行到文件末尾的操作。

我喜欢使用艺术风格的程序。 根据他们的网站 :

艺术风格是C,C ++,C#和Java编程语言的源代码压缩,格式化和美化。

它运行在Window,Linux和Mac上。 它会做缩进,用空格replace标签,反之亦然,在你喜欢的地方放置空格(把if(x<2)转换成if(x<2) ,如果你喜欢的话)与函数定义相同的行,或将它们移动到下面的行等。所有选项都由命令行参数控制。

为了在vim中使用它,只需将formatprg选项设置为它,然后使用gq命令。 所以,例如,我在我的.vimrc中:

 autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb 

所以无论何时打开一个.cpp文件,formatprg都是用我喜欢的选项设置的。 然后,我可以inputgg到文件的顶部,然后按照我的标准格式化整个文件。 如果我只需要重新格式化一个函数,我可以到函数的顶部,然后键入g q [ ] ,它将重新格式化这个函数。

我对astyle的选项-T4pb只是我的偏好。 您可以查看他们的文档 ,然后更改选项,然后按照您的喜好对代码进行格式化。

这是一个演示。 在astyle之前:

 int main(){if(x<2){x=3;}} float test() { if(x<2) x=3; } 

之后(gggqG):

 int main() { if (x < 2) { x = 3; } } float test() { if (x < 2) x = 3; } 

希望有所帮助。

OP要求自动格式化,但接受了只能自动缩进的答案。

以下是区别:

原版的

 int main(){if(x<2){x=3;}} float test() { if(x<2) x=3; } 

自动缩进

 int main(){if(x<2){x=3;}} float test() { if(x<2) x=3; } 

自动套用格式

 int main() { if (x < 2) { x = 3; } } float test() { if (x < 2) x = 3; } 

已经提到了用于正确缩进代码的内build命令( gg=G )。 如果您想美化代码,则需要使用外部应用程序(如缩进) 。 由于%表示ex模式下的当前文件,所以可以像这样使用它:

 :!indent % 

插件vim-autoformat让你只用一个button就可以格式化缓冲区: https : //github.com/Chiel92/vim-autoformat 。 它使用外部格式的程序,回退到vim的缩进function。

我发现clang-format运作良好。

在clang文档中有一些例子的关键字

我更喜欢在vim中使用equalprg绑定。 这允许你用G=gg或其他= indent选项调用clang-format

只需将以下内容放在.vimrc文件中:

 autocmd FileType c,cpp setlocal equalprg=clang-format 

我喜欢上面提到的indent ,但是大多数时候我只想格式化我正在处理的一小部分文件。 由于indent可以从stdin中获取代码,因此非常简单:

  1. select你想用V或类似格式的代码块。
  2. input格式:!indent

astyle需要stdin,所以你可以在那里使用相同的技巧。

也许你可以试试以下$ indent -kr -i8 * .c

希望它对你有用!

我想补充一点,为了防止它被弄乱,你可以input:set paste之前:set paste粘贴。 粘贴后,您可以键入:set nopaste的东西,如js美化和缩进再次工作。

他们是一个叫indent的工具。 您可以使用apt-get indent下载它,然后运行indent my_program.c