indent命令是一个强大的C/C++代码格式化工具,主要用于:
# 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 |
注释相对于代码的缩进列数 |
| -cd |
声明中注释的列位置 |
| -cdb, --comment-delimiters-on-blank-lines | 在空行上放置注释分隔符 |
| -ce, --cuddle-else | 将else与前面的}放在同一行 |
| -ci |
连续行的缩进宽度 |
| -cli |
case标签的缩进宽度 |
| -d |
行注释相对于代码的缩进 |
| -di |
变量声明的缩进宽度 |
| -fc1, --format-first-column-comments | 格式化第一列的注释 |
| -i |
设置缩进级别(空格数) |
| -ip |
参数缩进宽度 |
| -l |
设置最大行长度 |
| -lc |
设置注释的最大行长度 |
| -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内核编码风格 |
格式化C源代码文件:
indent program.c
这将格式化program.c文件并创建备份文件program.c~。
将格式化结果输出到指定文件:
indent input.c -o output.c
使用K&R风格格式化代码:
indent -kr program.c
使用GNU编码风格:
indent -gnu program.c
设置4空格缩进和80字符行宽:
indent -i4 -l80 program.c
将格式化结果输出到终端而不修改原文件:
indent -st program.c
格式化目录中的所有C文件:
find . -name "*.c" -exec indent {} \;
使用多个选项进行精细控制:
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;}
indent -kr example.c
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++) {
printf("Number: %d\n", i);
}
return 0;
}
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空格缩进 |
在代码审查前统一代码风格:
# 格式化所有修改过的C文件
git diff --name-only HEAD | grep '\.c$' | xargs indent -kr
为整个项目创建统一的.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 {} \;
在Makefile中添加格式化目标:
# Makefile
format:
find . -name "*.c" -o -name "*.h" | xargs indent -kr -i4 -l80 -nut -ts8
创建自动化代码美化脚本:
#!/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
-npro 选项禁用备份| 工具 | 语言支持 | 特点 |
|---|---|---|
| indent | C, C++ | Unix传统工具,高度可配置 |
| clang-format | C, C++, Java, JavaScript等 | 基于Clang,支持现代C++,更智能 |
| astyle | C, C++, C#, Java | 跨平台,支持多种预定义风格 |
| uncrustify | C, C++, C#, Java, D | 高度可配置,支持复杂规则 |