【问题标题】:How can I autoformat/indent C code in vim?如何在 vim 中自动格式化/缩进 C 代码?
【发布时间】:2011-01-22 06:52:41
【问题描述】:

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

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

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

【问题讨论】:

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

标签: c vim code-formatting


【解决方案1】:

尝试以下击键:

gg=G

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

【讨论】:

  • 这只会缩进代码。不能对整个事情进行自动格式化吗?
  • @Ton van: See my answer 区别(无法在 cmets 中解释)。
  • -1 这只修复缩进,而不是格式化(这是要求的)。
  • @oligofren OP的例子只包括缩进错误,他接受了答案,所以我猜这就是他的意思。
  • @oligofren 另外,他指定他从另一个文件复制代码,这使得缩进问题比其他格式问题更容易出现。
【解决方案2】:

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

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

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

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

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

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

我对 astyle 的选项-T4pb 只是我的偏好。您可以查看their docs,并更改选项以使其按照您喜欢的方式格式化代码。

这是一个演示。在样式之前:

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

希望对您有所帮助。

【讨论】:

  • 其他格式有这样的吗? ruby、xml、json等?
  • @Ryan 检查 vim-autoformat,请参阅下面的答案。顺便说一句,vim-autoformat 也使用 astyle 等。
  • 谢谢!我开始认为我是这个词中唯一不希望他们的左括号与函数声明在同一行的人!
【解决方案3】:

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

:!indent %

【讨论】:

    【解决方案4】:

    我发现clang-format 效果很好。

    clang documentation 中有一些示例键绑定

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

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

    autocmd FileType c,cpp setlocal equalprg=clang-format
    

    【讨论】:

    • 需要先安装,例如ubuntu 16.04+:sudo apt install clang-format
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

        我想补充一点,为了防止它首先被弄乱,您可以在粘贴之前输入:set paste。粘贴后,您可以输入:set nopaste 以再次使用js-beautify和缩进等内容。

        【讨论】:

        • 我为此使用:set paste!,它切换粘贴值而不是设置它。这样可以更轻松地关闭,因为您只需向后滚动几个命令并按 Enter。
        【解决方案8】:

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

        希望对你有用!

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 这个 GNU 工具糟透了……我不喜欢它!
          猜你喜欢
          • 2023-03-27
          • 2012-09-25
          • 1970-01-01
          • 2010-09-10
          • 1970-01-01
          • 2018-01-03
          • 2011-06-03
          • 2012-04-16
          相关资源
          最近更新 更多