Claude Code Status Line 自定义指南:从配不对颜色到终于看清
故事是这样的。前几天我在 Claude Code 里问了一句「为什么我看不到 token 统计」,然后花了一个多小时折腾配色。
不是写代码费时间——是在「调亮一点」「更看不清楚了」「换个配色方案」「还是看不清」之间反复了四五轮。
最后发现,问题根本不在亮不亮,而在我选错了颜色体系。
这篇不只是一篇教程。它是你自定义 Status Line 时的避坑地图——我把所有走错的路都标出来了。
Status Line 是什么
Claude Code 底部有一条状态栏,默认显示目录名、Git 分支、模型名、上下文剩余百分比等信息。它本质上是 Claude Code 每轮对话后,把一个 JSON 数据结构通过 stdin 管道传给一个自定义脚本,脚本输出什么字符串,状态栏就显示什么。
配置在 ~/.claude/settings.json 里:
{
"statusLine": {
"command": "sh ~/.claude/statusline.sh",
"padding": 0,
"refreshInterval": 10,
"type": "command"
}
}
type: "command" 表示执行外部命令,脚本的 stdin 会收到一个完整的 JSON 对象。脚本只需要往 stdout 输出一段带 ANSI 颜色编码的文本即可。
你也可以直接使用社区维护的 npm 包 ccstatusline — npx -y ccstatusline@latest — 内置多种主题和配置选项,开箱即用。我现在实际用的就是它,省去了自己维护脚本的麻烦。
你面前有什么数据
这是脚本收到的 JSON 结构(节选我实际 dump 到的数据):
{
"workspace": { "current_dir": "/Users/ruofeng/..." },
"model": { "display_name": "deepseek-v4-flash-260425" },
"context_window": {
"total_input_tokens": 322493,
"total_output_tokens": 8124,
"context_window_size": 200000,
"current_usage": {
"input_tokens": 355,
"output_tokens": 66
},
"used_percentage": 23,
"remaining_percentage": 77
}
}
关键字段:
| 字段 | 含义 |
|---|---|
workspace.current_dir | 当前工作目录 |
model.display_name | 模型名称 |
context_window.total_input_tokens | 当前会话累计输入 token 数 |
context_window.total_output_tokens | 累计输出 token 数 |
context_window.context_window_size | 上下文窗口上限(通常 200K) |
context_window.used_percentage | 已用上下文百分比 |
context_window.remaining_percentage | 剩余百分比 |
context_window.current_usage.input_tokens | 最近一轮输入 token 数 |
context_window.current_usage.output_tokens | 最近一轮输出 token 数 |
第一个坑:猜字段名
我当时没去 dump 实际数据结构,直接凭经验猜了几个字段名:context_window.tokens_used、context_window.max_tokens。
结果全为空。
如果你用了一下午折腾脚本但啥也没显示,大概率是字段名错了。正确的做法是先 dump 原始 JSON:
# 临时改一下 statusLine command
"command": "sh -c 'cat > /tmp/status_debug.json'"
重启一次,看看实际收到了什么。我就是这么干的,然后才发现字段名跟我猜的完全不同。
第二个坑:以及更大的坑——颜色
脚本逻辑本身很简单:用 jq 解析 JSON,拼 ANSI 颜色码,printf 输出。我写完功能部分后,决定把颜色弄得好看一点。
因为我的终端用的是 Catppuccin Mocha 主题,我挑了它的 Peach、Yellow、Green、Lavender、Pink 五色,转成 RGB 后用 24-bit ANSI 编码:
# Catppuccin Mocha 色板(好看但容易看不清)
PEACH='\033[38;2;250;179;135m'
YELLOW='\033[38;2;249;226;175m'
GREEN='\033[38;2;166;227;161m'
结果就是一连串的翻车:
- 第一版:颜色太浅 → 调亮 RGB 值
- 第二版:更看不清楚 → 加
1;粗体 - 第三版:还是看不清 → 换回标准 ANSI 16 色调色板——这次终于看清了
问题根因很直接:Catppuccin Mocha 的配色本身就是低对比度的柔和色板,适合 GUI 界面里的装饰元素,但终端状态栏不是装饰——你需要在一两秒内扫到关键信息。RGB 24-bit 颜色的中低亮度区域在深色背景上对比度不足,即使用了粗体,观感还是糊。
最终的配色方案反而最简单:
# 终端标准 16 色调色板 + 粗体
DIR_COLOR='\033[1;36m' # 青色
BRANCH_COLOR='\033[1;33m' # 黄色
MODEL_COLOR='\033[1;32m' # 绿色
TOKEN_COLOR='\033[1;35m' # 品红
INFO_COLOR='\033[1;37m' # 白色
这些是终端内置的标准色。不管你是 Mocha、Dracula、Nord 还是 Solarized,它们都被映射到终端主题里最高对比度的那几个位置。1; 再加粗,可读性拉满。
成品
这是我的最终脚本 ~/.claude/statusline.sh:
#!/bin/bash
input=$(cat)
cwd=$(echo "$input" | jq -r '.workspace.current_dir')
model=$(echo "$input" | jq -r '.model.display_name')
total_in=$(echo "$input" | jq -r '.context_window.total_input_tokens // empty')
total_out=$(echo "$input" | jq -r '.context_window.total_output_tokens // empty')
remaining=$(echo "$input" | jq -r '.context_window.remaining_percentage // empty')
dir_short=$(basename "$cwd")
git_branch=""
if git -C "$cwd" --no-optional-locks rev-parse --git-dir > /dev/null 2>&1; then
git_branch=$(git -C "$cwd" --no-optional-locks branch --show-current 2>/dev/null || "")
fi
# 格式化大数字:322493 → 322.4K(保留一位小数)
format_num() {
local n=$1
if [ "$n" -ge 1000000 ]; then
echo "scale=1; $n / 1000000" | bc | sed 's/\.0$//' | sed 's/$/M/'
elif [ "$n" -ge 1000 ]; then
echo "scale=1; $n / 1000" | bc | sed 's/\.0$//' | sed 's/$/K/'
else
echo "$n"
fi
}
DIR_COLOR='\033[1;36m' # 青色 - 目录
BRANCH_COLOR='\033[1;33m' # 黄色 - Git 分支
MODEL_COLOR='\033[1;32m' # 绿色 - 模型名称
TOKEN_COLOR='\033[1;35m' # 品红 - token 统计
INFO_COLOR='\033[1;37m' # 白色 - 百分比
RESET='\033[0m'
printf "${DIR_COLOR}${dir_short} "
[ -n "$git_branch" ] && printf "${BRANCH_COLOR}${git_branch} "
printf "${MODEL_COLOR}${model} "
if [ -n "$total_in" ]; then
in_fmt=$(echo "scale=1; $total_in / 1000" | bc | sed 's/\.0$//')K
printf "${TOKEN_COLOR}${in_fmt} "
fi
if [ -n "$total_out" ]; then
out_fmt=$(echo "scale=1; $total_out / 1000" | bc | sed 's/\.0$//')K
printf "${MODEL_COLOR}↩${out_fmt} "
fi
[ -n "$remaining" ] && printf "${INFO_COLOR}${remaining}%%"
printf "${RESET}"
效果是:
tech-blog main deepseek-v4-flash-260425 322.4K ↩8.1K 77%
青色是目录,黄色是分支,绿色是模型,品红是输入 token 数,↩ 前缀的绿色数字是累计输出 token 数,白色是剩余百分比。一眼前就能定位到自己要看的信息。
还能加什么
JSON 里还有 context_window.total_output_tokens 和 current_usage(最近一轮的 input/output),你可以按需加到状态栏:
- 显示缓存命中:
cache_read_input_tokens - 显示上下文压力:
used_percentage - 显示会话耗时:
session_duration_seconds
我现在的实际配置
上面那个脚本是我折腾过程的产物,但现在日常用的其实是社区包 ccstatusline。settings.json 里的配置是:
{
"statusLine": {
"command": "npx -y ccstatusline@latest",
"padding": 0,
"refreshInterval": 10,
"type": "command"
}
}
ccstatusline 默认输出两行信息:
tech-blog main 8.1k Ctx Used: 23.0%
Model: deepseek-v4-flash-260425
第一行是目录、Git 分支、输出 token 数、上下文使用率;第二行是模型名称。它内置了色彩方案和 Powerline 风格支持,比我那个手写脚本丰富得多。
ccstatusline 提供了一个交互式 TUI,可以可视化地增删 widget、调整颜色主题、修改分隔符样式。但即便是默认配置,开箱即用的体验已经足够好。
# Run the configuration TUI with npm
npx -y ccstatusline@latest
# Or with Bun (faster)
bunx -y ccstatusline@latest
实际效果图

之所以从自定义脚本切到 ccstatusline,主要原因是它帮我省去了维护工作:社区在持续更新,不断新增 widget(比如 Git PR 状态、会话压缩计数、API 速率限制),而我不用自己写一行代码。
一点感想
折腾完这个状态栏,我最大的收获不是脚本本身——它也就 30 行。
真正学到的就两件事:
- 先看数据结构再写代码。花五分钟 dump 原始 JSON,省的是半小时的试错。这个道理在哪都适用。
- 终端配色不要选好看的,要选能看清的。Catppuccin、Dracula 这些主题在 GUI 里很漂亮,但终端状态栏不是 UI 设计——它是以信息获取效率为唯一目标的。标准 16 色调色板被用了三十多年不是因为它老,而是因为它管用。
评论互动