当我尝试使用以下命令格式化我的 C 代码时GNU 缩进,它似乎不处理多层嵌套缩进。具体来说,它似乎折叠了第二级缩进。
例如,如果这是我开始的代码:
#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 版本。
答案1
它使用混合空格和(8 个空格)制表符来缩进。您可以通过这个最小的示例看到这一点:
int main() {
if (true) {
while (false) {
puts("");
}
}
}
如果我运行一遍indent -kr
然后hexdump -C
,我得到这个:
$ indent -kr < mini.c |hexdump -C
00000000 69 6e 74 20 6d 61 69 6e 28 29 0a 7b 0a 20 20 20 |int main().{. |
00000010 20 69 66 20 28 74 72 75 65 29 20 7b 0a 09 77 68 | if (true) {..wh|
00000020 69 6c 65 20 28 66 61 6c 73 65 29 20 7b 0a 09 20 |ile (false) {.. |
00000030 20 20 20 70 75 74 73 28 22 22 29 3b 0a 09 7d 0a | puts("");..}.|
00000040 20 20 20 20 7d 0a 7d 0a | }.}.|
00000048
您可以看到 前面while
有一个09
(水平制表符)字节,而puts
前面有一个制表符和四个空格 ( 20
)。默认值类似:
00000000 69 6e 74 0a 6d 61 69 6e 20 28 29 0a 7b 0a 20 20 |int.main ().{. |
00000010 69 66 20 28 74 72 75 65 29 0a 20 20 20 20 7b 0a |if (true). {.|
00000020 20 20 20 20 20 20 77 68 69 6c 65 20 28 66 61 6c | while (fal|
00000030 73 65 29 0a 09 7b 0a 09 20 20 70 75 74 73 20 28 |se)..{.. puts (|
00000040 22 22 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a |"");..}. }.}.|
00000050
虽然在这里,只有最里面的大括号并puts
得到一个选项卡。
您可以使用-nut
/--no-tabs
选项在任何地方使用空格:
$ indent -kr -nut fizzbuzz.c
或者,如果坚持原始缩进很重要,您可以将编辑器和/或终端配置为使用 8 个宽的选项卡而不是 4 个。该expand
命令可能有助于转换您不想重新缩进的现有文件。