当我尝试使用GNU Indent格式化我的 C 代码时,它似乎无法处理多层嵌套缩进。具体来说,它似乎折叠了第二级缩进。
例如,如果这是我开始的代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
int n;
if (argc > 1) {
printf("# of args: %d\n", argc);
}
for (n = 1; n <= 15; n++) {
if (n % 3 == 0) {
printf("fizz %d\n", n);
} else if (n % 5 == 0) {
printf("buzz %d\n", n);
} else if (n % 3 == 0 && n % 5 == 0) {
printf("fizzbuzz %d\n", n);
} else {
printf("%d\n", n);
}
}
return 0;
}
如果我运行indent -kr fizzbuzz.c
,我会得到这个:
#include <stdio.h>
int main(int argc, char *argv[])
{
int n;
if (argc > 1) {
printf("# of args: %d\n", argc);
}
for (n = 1; n <= 15; n++) {
if (n % 3 == 0) {
printf("fizz %d\n", n);
} else if (n % 5 == 0) {
printf("buzz %d\n", n);
} else if (n % 3 == 0 && n % 5 == 0) {
printf("fizzbuzz %d\n", n);
} else {
printf("%d\n", n);
}
}
return 0;
}
如果我只使用默认值 ( indent fizzbuzz.c
) 运行它,我会得到:
#include <stdio.h>
int
main (int argc, char *argv[])
{
int n;
if (argc > 1)
{
printf ("# of args: %d\n", argc);
}
for (n = 1; n <= 15; n++)
{
if (n % 3 == 0)
{
printf ("fizz %d\n", n);
}
else if (n % 5 == 0)
{
printf ("buzz %d\n", n);
}
else if (n % 3 == 0 && n % 5 == 0)
{
printf ("fizzbuzz %d\n", n);
}
else
{
printf ("%d\n", n);
}
}
return 0;
}
似乎如果它是开箱即用的,很多人会问它,因为如果它不是错误,那么格式化代码似乎是一种非常奇怪的方式。为什么这样做?
我正在使用 GNU Indent 的 2.2.11 版本。
它使用混合空格和(8 个空格)制表符来缩进。您可以通过这个最小的示例看到这一点:
如果我运行它
indent -kr
然后hexdump -C
,我得到这个:您可以看到,
while
前面有一个09
(水平制表符)字节,而puts
前面有一个制表符和四个空格(20
)。默认类似:虽然在这里,只有最里面的大括号并
puts
得到一个标签。您可以使用
-nut
/--no-tabs
选项在任何地方使用空格:或者,如果坚持原始缩进很重要,您可以将编辑器和/或终端配置为使用 8 个宽度的选项卡而不是 4 个。该
expand
命令可能有助于转换您不想重新缩进的现有文件。