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


250

当我从另一个文件复制代码时,格式混乱,如下所示:

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

如何在Vim中自动格式化此代码?


3
对于任何希望格式化而不只是缩进代码的人,第二个答案(我的答案)可以解决这个问题。如果您只想修复缩进,则可接受的答案是最简单的方法。
德里克(Derek)

Answers:


566

请尝试以下击键:

gg=G

说明:gg转到文件的顶部,=是修复缩进并G告诉它执行操作到文件末尾的命令。


28
这只会缩进代码。不能对整个事情进行自动格式化吗?
N 1.1

7
有什么区别?
Ton van den Heuvel

3
@Ton van:看看我的回答是否有区别(在注释中无法解释)。
Lazer

2
-1这仅修复缩进,而不修复格式(这是要求的格式)。
oligofren

3
@oligofren OP的示例仅包含缩进错误,并且他接受了答案,所以我想这就是他的意思。
Amir Rachum

78

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

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

它可以在Window,Linux和Mac中运行。它将执行缩进,用空格替换制表符等操作,反之亦然,根据需要在操作周围放置空格(转换if(x<2)为if( x<2 )喜欢的方式),将花括号与函数定义放在同一行,或将其移动到等等。所有选项均由命令行参数控制。

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

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

因此,每当我打开.cpp文件时,都会使用我喜欢的选项设置formatprg。然后,我可以键入gg转到文件顶部,并gqG根据我的标准设置整个文件的格式。如果只需要重新格式化一个函数,则可以转到该函数的顶部,然后键入gq][,它将重新格式化该功能。

我为astyle提供的选项-T4pb只是我的偏好。您可以浏览他们的文档,并更改选项以使其按自己的喜好格式化代码。

这是一个演示。换气之前:

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;
}

希望能有所帮助。


3
其他格式是否有类似的东西?红宝石,xml,json等?
derGral 2011年

1
@Ryan检查vim-autoformat,请参见下面的答案。BTW vim-autoformat还使用astyle等。
Chiel 10 Brinke

1
谢谢!我开始认为我是这个词中唯一不想在函数声明的同一行中使用左括号的人!
user3640967 '16

27

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

:!indent %


11

我发现 clang-format效果很好。

在其中有一些示例键绑定 clang文档中

我更喜欢equalprg在vim中使用绑定。这使您可以clang-format使用G=gg或其他调用=缩进选项。

只需将以下内容放入您的.vimrc文件中:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
需要首先安装它,例如对于Ubuntu 16.04+:sudo apt install clang-format
Eric Wang


3

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

  1. 选择您要使用其格式的代码块V或类似内容。
  2. 键入格式:!indent

astyle 也需要stdin,因此您可以在此处使用相同的技巧。


2

我想补充一点,为了防止它一开始就被弄乱,您可以:set paste在粘贴之前输入。粘贴后,您可以输入:set nopaste诸如js-beautify和缩进之类的内容以重新工作。


1
我用:set paste!它来切换粘贴值而不是设置它。这使关闭更容易,因为您可以简单地向后滚动一些命令并按Enter。
a'r

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.