<div align="center">
<img src="docs/assets/icon.png" alt="paline" width="200">
<h1>Paline</h1>
</div>
[](https://opensource.org/licenses/MIT)
[](https://www.rust-lang.org)
> 一个快速统计代码行数的命令行工具。递归扫描目录,按编程语言统计行数,并在终端中以彩色横向条形图直观展示各语言的行数占比。
<img src="docs/assets/demo.gif" alt="demo">
## 特性
- 递归扫描目录,自动跳过 `.gitignore` 中忽略的文件与隐藏文件
- 根据扩展名识别多种常见编程语言 / 标记语言(C/C++、Python、Java、Go、Rust、JS/TS、Shell 等)
- 基于 `rayon` 并行统计,大项目速度快
- 彩色条形图 + 语言图例,占比一目了然
- 支持 `-vv` 逐文件调试日志
## 快速开始
### 通过 Cargo
```bash
cargo install paline
```
### 或从源码构建
```bash
git clone https://github.com/luxpapilio/paline.git
cd paline && cargo build --release
```
### 使用
### 基本统计
```bash
# 统计当前目录(默认)
paline stats
# 统计指定目录
paline stats -p /path/to/project
# 输出调试日志(-vv 显示逐文件追踪)
paline stats -vv
# 统计当前 git 仓库某个 Commit
paline stats -c eaece83c2369440d9a321080deb034acf08cd115
```
### 对比差异
```bash
# 对比 base commit 与当前工作树的净变化
paline diff --base eaece83c2369440d9a321080deb034acf08cd115
# 对比两个 commit 的净变化
paline diff --base eaece83c2369440d9a321080deb034acf08cd115 --target b87ed48c2369440d9a321080deb034acf08cd115
```
> 说明:`diff` 子命令显示的是 新增行数 - 删除行数 的净增量
### 命令行参数
| `stats [OPTIONS]` | 统计目录或指定 commit 的行数 `-c --commit <commit hash>` 参数表示要统计的 commit 的 hash |
| `diff --base <commit> [--target <commit\|WORKTREE>]` | 对比 `base` commit 与 `target` 的净变化,`target` 默认为 `WORKTREE`(当前工作树),也可以是另一个 commit hash |
| `-p, --path <PATH>` | 要统计的文件或目录,默认为 `.`(当前目录) |
| `-v, --verbose` | 输出 debug 日志,`-vv` 显示逐文件追踪 |
| `-h, --help` | 显示帮助信息 |
| `-V, --version` | 显示版本号 |
## 行数统计规则
- **行数计算**:按换行符 `\n` 分割统计。如果文件末尾缺少换行符,会补计一行。
- **空文件**:计为 0 行,并且不被纳入语言类别中。
- **忽略规则**:自动忽略 .gitignore 中定义的文件。
- **语言识别**:基于文件扩展名映射到语言类别。
## 配置文件
### 配置文件位置
首次运行时,Paline 会在以下目录生成默认配置文件(如果不存在):
- **Linux / macOS**:~/.config/paline/languages.toml
- **Windows**:%APPDATA%\paline\languages.toml
### 配置格式
配置文件为 TOML 格式,结构如下:
```toml
[[lang]]
id = "rust" # 语言唯一标识(用于内部索引)
name = "Rust" # 显示名称
extensions = ["rs"] # 关联的扩展名列表(不含点)
exact_filenames = [] # 精确文件名列表(如 Makefile、CMakeLists.txt)
color = [222, 165, 132] # RGB 颜色分量,范围 0~255
```
每个 [[lang]] 表项对应一种语言,你可以定义任意数量。
### 示例:添加 Zig 语言支持
```toml
[[lang]]
id = "zig"
name = "Zig"
extensions = ["zig"]
exact_filenames = []
color = [247, 138, 30]
```
### 示例:修改 Python 的显示颜色
```toml
[[lang]]
id = "python"
name = "Python"
extensions = ["py", "pyw", "pyi"]
exact_filenames = []
color = [255, 200, 0] # 从默认的蓝色改为黄色
```
## 贡献
欢迎提交 Issue 和 Pull Request!
> 📘 **面向贡献者**:开发环境搭建、提交前检查脚本(`scripts/push.py`)的详细用法,请参阅 [贡献者指南](CONTRIBUTING.md)。
## 许可
本项目采用 [MIT 许可证](LICENSE)。
Copyright © 2026 [luxpapilio](https://github.com/luxpapilio)