Linux indent命令 详解

indent命令 是一个C/C++源代码格式化工具,用于美化和统一代码风格。

命令简介

indent命令是一个强大的C/C++代码格式化工具,主要用于:

  • 自动调整代码缩进和格式
  • 统一团队的代码风格
  • 修复混乱的代码布局
  • 转换不同风格的代码格式
  • 提高代码可读性和维护性

安装indent

# Ubuntu/Debian
sudo apt-get install indent

# CentOS/RHEL
sudo yum install indent

# macOS
brew install indent

命令语法

indent [选项] [输入文件] [-o 输出文件]

常用选项

选项 说明
-bad, --blank-lines-after-declarations 在声明后强制添加空行
-bap, --blank-lines-after-procedures 在过程后强制添加空行
-bbb, --blank-lines-after-block-comments 在块注释后强制添加空行
-bc, --blank-lines-after-commas 在声明中的逗号后换行
-bl, --braces-after-if-line 将大括号放在if语句行后
-br, --braces-on-if-line 将大括号放在if语句行(默认)
-c, --comment-indentation 注释相对于代码的缩进列数
-cd, --declaration-comment-column 声明中注释的列位置
-cdb, --comment-delimiters-on-blank-lines 在空行上放置注释分隔符
-ce, --cuddle-else 将else与前面的}放在同一行
-ci, --continuation-indentation 连续行的缩进宽度
-cli, --case-indentation case标签的缩进宽度
-d, --line-comments-indentation 行注释相对于代码的缩进
-di, --declaration-indentation 变量声明的缩进宽度
-fc1, --format-first-column-comments 格式化第一列的注释
-i, --indent-level 设置缩进级别(空格数)
-ip, --parameter-indentation 参数缩进宽度
-l, --line-length 设置最大行长度
-lc, --comment-line-length 设置注释的最大行长度
-lp, --continue-at-parentheses 在括号处继续行
-nbad, --no-blank-lines-after-declarations 不在声明后添加空行
-npsl, --dont-break-procedure-type 过程类型放在同一行
-saf, --space-after-for 在for后添加空格
-sai, --space-after-if 在if后添加空格
-saw, --space-after-while 在while后添加空格
-sc, --start-left-side-of-comments 在注释左侧放置'*'
-sob, --swallow-optional-blank-lines 删除可选的空行
-st, --standard-output 输出到标准输出
-T 指定类型名称
-v, --verbose 详细模式
--version 显示版本信息

预定义风格

indent提供了一些预定义的代码风格:

风格选项 说明
-kr, --k-and-r-style Kernighan & Ritchie 风格
-gnu, --gnu-style GNU 编码风格
-orig, --original 原始Berkeley风格
-linux, --linux-style Linux内核编码风格

使用示例

1. 基本格式化

格式化C源代码文件:

indent program.c

这将格式化program.c文件并创建备份文件program.c~。

2. 指定输出文件

将格式化结果输出到指定文件:

indent input.c -o output.c

3. 使用预定义风格

使用K&R风格格式化代码:

indent -kr program.c

4. 使用GNU风格

使用GNU编码风格:

indent -gnu program.c

5. 自定义缩进

设置4空格缩进和80字符行宽:

indent -i4 -l80 program.c

6. 格式化到标准输出

将格式化结果输出到终端而不修改原文件:

indent -st program.c

7. 批量格式化文件

格式化目录中的所有C文件:

find . -name "*.c" -exec indent {} \;

8. 复杂选项组合

使用多个选项进行精细控制:

indent -kr -i4 -l80 -nut -ts4 -br -ce -npcs program.c

格式化示例对比

格式化前

#include <stdio.h>
int main(){int i;for(i=0;i<10;i++){printf("Number: %d\n",i);}return 0;}

使用K&R风格格式化后

indent -kr example.c
#include <stdio.h>
int main()
{
    int i;
    for (i = 0; i < 10; i++) {
        printf("Number: %d\n", i);
    }
    return 0;
}

使用GNU风格格式化后

indent -gnu example.c
#include <stdio.h>
int
main ()
{
  int i;
  for (i = 0; i < 10; i++)
    {
      printf ("Number: %d\n", i);
    }
  return 0;
}

配置文件

可以创建 .indent.pro 文件来保存常用的indent选项:

# .indent.pro 文件内容
-kr
-i4
-l80
-nut
-ts8
-br
-ce
-npcs

当indent在当前目录或用户主目录找到.indent.pro文件时,会自动应用其中的选项。

常用选项组合

风格 选项组合 说明
K&R风格 -kr -i4 -l80 -nut -ts8 经典C语言风格,4空格缩进
GNU风格 -gnu -i2 -l80 GNU项目风格,2空格缩进
Linux风格 -linux -i8 -l80 Linux内核风格,8空格缩进
个人偏好 -br -ce -i4 -l100 -nut 大括号同行,else同行,4空格缩进

实际应用场景

1. 代码审查前格式化

在代码审查前统一代码风格:

# 格式化所有修改过的C文件
git diff --name-only HEAD | grep '\.c$' | xargs indent -kr

2. 项目代码风格统一

为整个项目创建统一的.indent.pro文件:

# 在项目根目录创建配置文件
cat > .indent.pro << EOF
-kr
-i4
-l80
-nut
-ts8
-br
-ce
-npcs
EOF

# 格式化所有C文件
find . -name "*.c" -exec indent {} \;
find . -name "*.h" -exec indent {} \;

3. 集成到构建系统

在Makefile中添加格式化目标:

# Makefile
format:
    find . -name "*.c" -o -name "*.h" | xargs indent -kr -i4 -l80 -nut -ts8

4. 代码美化脚本

创建自动化代码美化脚本:

#!/bin/bash
# beautify.sh - 代码美化脚本

INDENT_OPTS="-kr -i4 -l80 -nut -ts8 -br -ce -npcs"

for file in "$@"; do
    if [[ $file == *.c || $file == *.h ]]; then
        echo "格式化: $file"
        indent $INDENT_OPTS "$file"
    fi
done

注意事项

  • indent默认会创建备份文件(原文件名后加~),使用 -npro 选项禁用备份
  • 某些复杂的宏或预处理器指令可能被错误格式化
  • 在格式化前建议先备份重要代码
  • 不同的indent版本可能有略微不同的行为
  • 对于C++代码,indent的支持可能不如C代码完善
  • 格式化后务必编译测试,确保没有引入语法错误

与其他工具的比较

工具 语言支持 特点
indent C, C++ Unix传统工具,高度可配置
clang-format C, C++, Java, JavaScript等 基于Clang,支持现代C++,更智能
astyle C, C++, C#, Java 跨平台,支持多种预定义风格
uncrustify C, C++, C#, Java, D 高度可配置,支持复杂规则

相关命令

  • cb - C程序美化器(简单版indent)
  • clang-format - LLVM代码格式化工具
  • astyle - 艺术风格代码格式化器
  • uncrustify - 高度可配置的代码格式化工具
  • gcc - GNU C编译器
  • make - 项目构建工具