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

问题描述 投票:0回答:10

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

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

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

c vim code-formatting
10个回答
706
投票

尝试以下按键:

gg=G

说明:

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


95
投票

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

Artistic Style 是 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;
}

astyle之后(gggqG):

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

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

34
投票

已经提到了用于正确缩进代码的内置命令(

gg=G
)。如果您想美化代码,则需要使用indent等外部应用程序。由于
%
表示 ex 模式下的当前文件,因此您可以这样使用它:

:!indent %

24
投票

我发现

clang-format
效果很好。

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

我更喜欢在 vim 中使用

equalprg

 绑定。这允许您使用 
clang-format
 或其他 
G=gg
 缩进选项调用 
=

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

autocmd FileType c,cpp setlocal equalprg=clang-format
    

19
投票
插件 vim-autoformat 允许您使用单个命令格式化缓冲区(或缓冲区选择):

https://github.com/vim-autoformat/vim-autoformat。它使用外部格式程序来实现此目的,并回退到 vim 的缩进功能。


8
投票
我喜欢上面提到的

indent

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

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

astyle

 也接受标准输入,所以你可以在那里使用相同的技巧。


6
投票
我想补充一点,为了防止它一开始就被搞乱,你可以在粘贴之前输入

:set paste

。粘贴后,您可以输入 
:set nopaste
 来执行诸如 js-beautify 和缩进之类的操作。


4
投票
也许你可以尝试以下方法

$缩进-kr -i8 *.c


1
投票
他们的工具叫

indent

。您可以使用 
apt-get install indent
 下载它,然后运行 
indent my_program.c


0
投票
对于这里提到的许多选项的良好概述和演示,@Gavin-Freeborn 在 YouTube 上有一个很棒的视频:

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

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

=

gq
formatprg

© www.soinside.com 2019 - 2024. All rights reserved.