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

Yon*_*ing 239 c vim code-formatting

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

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*hum 540

尝试以下按键:

gg=G
Run Code Online (Sandbox Code Playgroud)

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

  • 这只是缩进代码.可以对AUTOFORMAT做一些事吗? (25认同)
  • 有什么不同? (7认同)
  • @Ton van:[请参阅我的回答](http://stackoverflow.com/questions/2355834/auto-format-c-file-in-vim/4236918#4236918)了解差异(此处未在评论中说明) . (3认同)
  • -1这只能修复缩进,而不是格式化(这是要求的). (2认同)
  • @oligofren OP的例子只包括缩进错误,他接受了答案,所以我想这就是他的意思. (2认同)
  • @oligofren 此外,他指定他从另一个文件复制代码,这使得缩进问题比其他格式问题更容易出现。 (2认同)

Der*_*rek 77

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

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

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

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

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb
Run Code Online (Sandbox Code Playgroud)

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

我对astyle的选择-T4pb只是我的偏好.您可以浏览他们的文档,并更改选项以使其根据您的喜好格式化代码.

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

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

float test()
{
if(x<2)
x=3;
}
Run Code Online (Sandbox Code Playgroud)

astyle(gggqG)之后:

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

float test()
{
    if (x < 2)
        x = 3;
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 其他格式是否有这样的东西; ruby,xml,json等? (3认同)
  • @Ryan 检查 vim-autoformat,请参阅下面的答案。顺便说一句,vim-autoformat 还使用了 astyle。 (2认同)

Laz*_*zer 56

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

这是区别:

原版的

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

float test()
{
if(x<2)
x=3;
}
Run Code Online (Sandbox Code Playgroud)

自动缩进

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

float test()
{
    if(x<2)
        x=3;
}
Run Code Online (Sandbox Code Playgroud)

自动套用格式

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

float test()
{
    if (x < 2)
        x = 3;
}
Run Code Online (Sandbox Code Playgroud)

  • -1这是评论,而不是答案.你需要提供实际完成自动装配的东西,而不仅仅是展示它是什么. (47认同)
  • 在这种特殊情况下,我不知道他怎么能通过发布答案来表达他的观点? (40认同)
  • 啊,我明白了.现在问题仍然是如何实际autoformat :) (15认同)
  • +我抵消这些文字野人的伤害. (10认同)
  • @oligofren他正在使用答案系统进行评论,而你正在使用评论系统进行投票;) (10认同)
  • @expelledboy也许通过编辑OP本身? (4认同)

sou*_*rge 26

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

:!indent %
Run Code Online (Sandbox Code Playgroud)


Chi*_*nke 13

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


Dan*_*iel 9

我发现clang-format效果很好.

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

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

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

autocmd FileType c,cpp setlocal equalprg=clang-format
Run Code Online (Sandbox Code Playgroud)

  • 需要先安装它,例如ubuntu 16.04+:`sudo apt install clang-format` (3认同)

dsu*_*rsl 5

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

  1. 选择您想要格式化的代码块V等。
  2. 通过键入格式化:!indent

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


atr*_*pes 5

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

  • 我为此使用 `:set Paste!`,它会切换粘贴值而不是设置它。这使得关闭变得更容易,因为您只需向后滚动几个命令并按 Enter 键即可。 (2认同)