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

时间:2010-03-01 12:50:43

标签: c vim code-formatting

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

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

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

10 个答案:

答案 0 :(得分:520)

尝试以下按键:

gg=G

说明:gg位于文件顶部,=是修复缩进的命令,G告诉它执行文件末尾的操作。< / p>

答案 1 :(得分:77)

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

  

Artistic Style是C,C ++,C#和Java编程语言的源代码压缩器,格式化器和美化器。

它在Window,Linux和Mac上运行。它会做一些事情,比如缩进,用空格替换制表符,反之亦然,在你喜欢的操作周围放置空格(如果你喜欢的话,将if(x<2)转换为if ( x<2 )),将大括号放在同一个位置line作为函数定义,或将它们移动到下面的行等。所有选项都由命令行参数控制。

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

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

这样每当我打开.cpp文件时,formatprg都会设置我喜欢的选项。然后,我可以输入gg转到文件的顶部,然后 g q G 根据我的标准格式化整个文件。如果我只需要重新格式化单个函数,我可以转到函数的顶部,然后输入 g q ] [ ,它将重新格式化该功能。

我对astyle的选项-T4pb只是我的偏好。您可以查看their docs,然后更改选项,让它根据您的喜好格式化代码。

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

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

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

astyle(gggqG)之后:

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

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

希望有所帮助。

答案 2 :(得分:53)

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

区别在于:

  

<强> ORIGINAL

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

答案 3 :(得分:26)

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

:!indent %

答案 4 :(得分:13)

插件vim-autoformat允许您使用单个命令格式化缓冲区(或缓冲区选择):https://github.com/Chiel92/vim-autoformat。它使用外部格式程序,并回退到vim的缩进功能。

答案 5 :(得分:9)

我发现clang-format效果很好。

clang documentation

中有一些示例键绑定

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

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

autocmd FileType c,cpp setlocal equalprg=clang-format

答案 6 :(得分:3)

也许您可以尝试以下方法   $ indent -kr -i8 * .c

希望它对你有用!

答案 7 :(得分:3)

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

  1. 使用 V 等选择要格式化的代码块。
  2. 键入:!indent
  3. 进行格式化

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

答案 8 :(得分:1)

我想补充一点,为了防止它在一开始就搞砸了,你可以在粘贴之前键入:set paste。粘贴后,您可以输入:set nopaste来查找js-beautify和缩进等内容。

答案 9 :(得分:0)

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