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

301

当我从另一个文件复制代码时,格式会变得混乱,就像这样:

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

我该如何在vim中自动格式化这段代码?


4
如果有人想要格式化代码而不仅是调整缩进,第二个答案(我的)解决了这个问题。如果你只是想修复缩进,那么被采纳的答案是最简单的方法。 - Derek
10个回答

684
尝试下面的按键组合:
gg=G

解释: gg 命令会跳转到文件顶部,= 命令是修复缩进的命令,而 G 则告诉它执行到文件末尾的操作。


36
这只是缩进代码。有没有办法自动格式化整个内容? - N 1.1
3
请看我的答案,了解它们之间的区别(在评论中无法解释清楚)。@Ton van:请点此查看 - Lazer
4
这只修复了缩进,而不是格式(这是被要求的内容)。 - oligofren
6
@oligofren OP的示例仅包含缩进错误,而且他接受了答案,所以我猜这就是他的意思。 - Amir Rachum
3
他还特别说明了他是从另一个文件中复制代码,这使得缩进问题比其他格式问题更有可能。 - Amir Rachum
显示剩余7条评论

93

我喜欢使用程序Artistic Style。根据他们的网站:

Artistic Style是C、C++、C#和Java编程语言的源代码缩进器、格式化工具和美化器。

它可以在Windows、Linux和Mac上运行。它会做一些事情,如缩进、用空格替换制表符或反之,按您想要的方式(将if(x<2)转换为if ( x<2 ),如果这是您喜欢的方式)在操作周围放置空格,将大括号放在与函数定义相同的行上,或将它们移动到下一行等。所有选项都由命令行参数控制。

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

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb
为了让我每次打开.cpp文件时都能够使用我喜欢的选项设置formatprg。然后,我可以输入gg到达文件顶部,并使用

3
还有其他格式的类似工具吗?比如 Ruby、XML、JSON 等等? - derGral
3
@Ryan,看一下vim-autoformat,下面有答案。顺便说一句,vim-autoformat还使用了astyle和其他工具。 - chtenb
1
谢谢!我开始觉得自己是世界上唯一一个不想把开括号放在函数声明同一行的人了! - user3640967

34

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

:!indent %

在使用此命令之前,请确保执行 sudo apt install indent 安装 indent 工具。 - Roel Van de Paar

24

我发现clang-format表现良好。

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

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

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

autocmd FileType c,cpp setlocal equalprg=clang-format

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

19

9

我喜欢如上所述的缩进,但我经常只想格式化我正在工作的文件中的一小部分。由于缩进可以从标准输入中读取代码,所以非常简单:

  1. 使用V或类似方法选择要格式化的代码块。
  2. 键入:!indent进行格式化。

astyle也可以从标准输入中读取,所以你可以在那里使用同样的技巧。


7
我想补充一点,为了避免第一次混乱,您可以在粘贴之前键入:set paste。 粘贴后,您可以键入:set nopaste使js-beautify和缩进等功能再次正常工作。

2
我使用 :set paste! 来实现这个功能,它可以切换粘贴值而不是设置它。这使得关闭变得更加容易,因为你只需要向后滚动几个命令并按下回车即可。 - a'r
你也可以为此设置一个热键。我希望不必这样做,但显然这是必要的恶。 - qwr

4
也许你可以尝试以下命令: $indent -kr -i8 *.c
希望对你有帮助!

1
有一个叫做 indent 的工具。你可以使用 apt-get install indent 命令进行下载,然后运行 indent my_program.c 命令。

1
这个GNU工具很糟糕,很奇怪...我不喜欢它! - 71GA
它非常可定制。我在我的 .bashrc 中将其用作 cb(C 美化器):alias cb='indent -kr -l200 -lc200 -cli2 -i4 -nut -linux $1' - user50619

-1

如果想要了解这里提到的许多选项的概述和演示,@Gavin-Freeborn在YouTube上有一个很棒的视频:

https://www.youtube.com/watch?v=tM_uIwSucPU

它涵盖了一些Vim插件以及内置功能,例如=gqformatprg


我有点困惑为什么这个被投票否决了;我发现这个视频比在这里尝试整理所有选项要更有用。我很乐意在这个答案中添加更多关于提到的功能的描述;只是我感觉其他答案已经填补了那一部分。 - Randall
1
这是一个基于书面文字的论坛。在没有相关细节的情况下,将读者引用到一个视频上很可能会在SO社区中受到冷遇。 - undefined
@erik258 - 谢谢,这看起来很公平。视频中有很多内容需要进行概括,除了我在回答中简要提到的=gqformatprg之外。这仍然是一个非常有用的视频;如果我能找到时间(和回忆)回过头来添加相关的文字摘录,我会这样做的。YouTube似乎已经停止提供转录,至少对于非高级账户来说,所以这需要额外的努力。无论如何,我非常感谢你的解释! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接