5. indent工具

indent工具可以把代碼格式化成某種風格,例如把例 9.1 “缺少縮進和空白的代碼”格式化成內核編碼風格:

$ indent -kr -i8 main.c 
$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
	char gesture[3][10] = { "scissor", "stone", "cloth" };
	int man, computer, result, ret;
	srand(time(NULL));
	while (1) {
		computer = rand() % 3;
		printf
		    ("\nInput your gesture (0-scissor 1-stone 2-cloth):\n");
		ret = scanf("%d", &man);
		if (ret != 1 || man < 0 || man > 2) {
			printf("Invalid input! Please input 0, 1 or 2.\n");
			continue;
		}
		printf("Your gesture: %s\tComputer's gesture: %s\n",
		       gesture[man], gesture[computer]);
		result = (man - computer + 4) % 3 - 1;
		if (result > 0)
			printf("You win!\n");
		else if (result == 0)
			printf("Draw!\n");
		else
			printf("You lose!\n");
	}
	return 0;
}

-kr選項表示K&R風格,-i8表示縮進8個空格的長度。如果沒有指定-nut選項,則每8個縮進空格會自動用一個Tab代替。注意indent命令會直接修改原檔案,而不是打印到屏幕上或者輸出到另一個檔案,這一點和很多UNIX命令不同。可以看出,-kr -i8兩個選項格式化出來的代碼已經很符合本章介紹的代碼風格了,添加了必要的縮進和空白,較長的代碼行也會自動折行。美中不足的是沒有添加適當的空行,因為indent工具也不知道哪幾行代碼在邏輯上是一組的,空行還是要自己動手添,當然原有的空行肯定不會被indent刪去的。

如果你採納本章介紹的內核編碼風格,基本上-kr -i8這兩個參數就夠用了。indent工具也有支持其它編碼風格的選項,具體請參考Man Page。有時候indent工具的確非常有用,比如某個項目中途決定改變編碼風格(這很少見),或者往某個項目中添加的幾個代碼檔案來自另一個編碼風格不同的項目,但絶不能因為有了indent工具就肆無忌憚,一開始把代碼寫得亂七八糟,最後再依靠indent去清理。