再也不用 /usage 了!用 Claude Code 自定义状态栏,把用量焦虑彻底消灭
前言:你是否也有这种焦虑?
用 Claude Code 写代码的时候,你有没有遇到过这种情况:
写到一半突然想起来——上下文快满了吗?今天的用量还剩多少?于是打断自己的思路,输入 /usage,等弹窗出来,瞄一眼,关掉,继续写。
每隔一段时间就来一次,完全打断心流。更难受的是有时候忘了查,等模型开始"变笨"了才意识到上下文已经快满了,或者用量已经到限制了。
后来我发现 Claude Code 其实内置了一个 statusline(状态栏) 功能,可以把你关心的所有信息一直显示在屏幕底部,完全不用再主动查了。配置好之后,那种用量焦虑几乎消失了。
这篇文章分享我的配置方案,以及如何一步一步配出来。
效果展示
配置完成后,Claude Code 界面底部会出现两行状态信息,长这样:

第一行 显示的是当前环境信息:
Sonnet 4.6 [Pro] AutoDNA (no git)
| 内容 | 含义 |
|---|---|
Sonnet 4.6 | 当前使用的模型名称 |
[Pro] | 订阅计划,Max 套餐会显示 [Max] |
AutoDNA (no git) | 当前工作目录名称,如果是 git 仓库则显示仓库名和分支 |
第二行 显示的是用量和费用信息:
Ctx: 66% Cache: 100% In: 13k Out: 425k ~$23.21 | 5h: 21% → 21:00 7d: 81% → Thu 00:00
| 内容 | 含义 |
|---|---|
Ctx: 66% | 当前对话上下文窗口已使用的百分比 |
Cache: 100% | Prompt Cache 命中率,越高说明缓存效果越好、费用越低 |
In: 13k / Out: 425k | 本次 session 累计输入/输出 token 数 |
~$23.21 | 本次 session 累计费用(Claude Code 内部统计,按实际 token 用量计算) |
5h: 21% → 21:00 | 5 小时滚动用量,以及用量重置时间 |
7d: 81% → Thu 00:00 | 7 天用量,以及下次重置时间 |
颜色含义:
- 🟢 绿色:用量低,不用担心
- 🟡 黄色:用量中等,留意一下
- 🔴 红色:用量较高,注意控制
Cache 命中率颜色相反:越高越好,高了显示绿色。
两种配置方法,按需选择
看到这里你可能会想:这么复杂的东西要怎么配?放心,有两种方法:
方法一:直接用现成脚本
我把自己用的脚本贴出来了,你直接复制粘贴到指定位置就行。如果你不想折腾,直接用这个就够了。需要简单的命令行操作,但不需要写代码。
方法二:让 Claude Code 自己给自己配置(强烈推荐)
这才是最神奇的地方:你只需要用聊天的方式描述你想要什么,Claude Code 会自动生成脚本、放到对应位置、完成配置文件修改——方法一的所有步骤它都会帮你做完。你完全不需要碰命令行,只需要会提需求。
建议:如果你是第一次用,可以直接跳到「方法二」,让 Claude Code 帮你配。下面的方法一主要是给想看脚本细节、或者想手动修改的人准备的。
方法一:直接用现成脚本
第一步:创建脚本文件
打开终端,运行以下命令创建脚本目录(如果不存在):
mkdir -p ~/.claude
然后用任意文本编辑器创建文件 ~/.claude/statusline-command.sh,将以下内容完整粘贴进去:
#!/bin/sh
# Claude Code status line script
input=$(cat)
# ANSI colors (POSIX-safe)
GREEN=$(printf '\033[32m')
YELLOW=$(printf '\033[33m')
RED=$(printf '\033[31m')
CYAN=$(printf '\033[36m')
RESET=$(printf '\033[0m')
# Color a percentage where high = bad (ctx, rate limits)
color_pct() {
n=$(echo "$1" | awk '{printf "%.0f", $1}')
if [ "$n" -ge 76 ]; then
printf '%s%s%%%s' "$RED" "$n" "$RESET"
elif [ "$n" -ge 51 ]; then
printf '%s%s%%%s' "$YELLOW" "$n" "$RESET"
else
printf '%s%s%%%s' "$GREEN" "$n" "$RESET"
fi
}
# Color a percentage where high = good (cache hit rate)
color_pct_inv() {
n=$(echo "$1" | awk '{printf "%.0f", $1}')
if [ "$n" -ge 71 ]; then
printf '%s%s%%%s' "$GREEN" "$n" "$RESET"
elif [ "$n" -ge 41 ]; then
printf '%s%s%%%s' "$YELLOW" "$n" "$RESET"
else
printf '%s%s%%%s' "$RED" "$n" "$RESET"
fi
}
# --- Line 1: Model + Plan, Git info ---
model_name=$(echo "$input" | jq -r '.model.display_name // "Unknown Model"')
model_id=$(echo "$input" | jq -r '.model.id // ""')
case "$model_id" in
*claude-opus*|*claude-3-opus*) plan="Max" ;;
*) plan="Pro" ;;
esac
cwd=$(echo "$input" | jq -r '.workspace.current_dir // .cwd // ""')
git_info=""
if [ -n "$cwd" ] && git -C "$cwd" rev-parse --git-dir > /dev/null 2>&1; then
repo_name=$(basename "$(git -C "$cwd" rev-parse --show-toplevel 2>/dev/null)")
branch=$(git -C "$cwd" symbolic-ref --short HEAD 2>/dev/null || git -C "$cwd" rev-parse --short HEAD 2>/dev/null)
worktree_name=$(echo "$input" | jq -r '.workspace.git_worktree // empty')
if [ -n "$worktree_name" ]; then
git_info="$repo_name ($branch) [$worktree_name]"
else
git_info="$repo_name ($branch)"
fi
else
git_info="no git"
fi
line1="${model_name} [${plan}] ${git_info}"
# --- Line 2 ---
# Context window usage %
ctx_used=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
ctx_part=""
if [ -n "$ctx_used" ]; then
ctx_part="Ctx: $(color_pct "$ctx_used")"
fi
# Cache hit rate from current_usage
cache_read=$(echo "$input" | jq -r '.context_window.current_usage.cache_read_input_tokens // 0')
cur_input=$(echo "$input" | jq -r '.context_window.current_usage.input_tokens // 0')
cache_part=""
cache_pct=$(echo "$cur_input $cache_read" | awk '{
total = $1 + $2
if (total > 0) printf "%.0f", $2 / total * 100
else print "0"
}')
if [ "$cache_read" -gt 0 ] || [ "$cur_input" -gt 0 ]; then
cache_part="Cache: $(color_pct_inv "$cache_pct")"
fi
# Session total tokens
in_tokens=$(echo "$input" | jq -r '.context_window.total_input_tokens // empty')
out_tokens=$(echo "$input" | jq -r '.context_window.total_output_tokens // empty')
token_part=""
if [ -n "$in_tokens" ] && [ -n "$out_tokens" ]; then
in_k=$(echo "$in_tokens" | awk '{printf "%.0fk", $1/1000}')
out_k=$(echo "$out_tokens" | awk '{printf "%.0fk", $1/1000}')
token_part="${CYAN}In:${RESET} ${in_k} ${CYAN}Out:${RESET} ${out_k}"
fi
# Session cost (directly from Claude Code)
cost_usd=$(echo "$input" | jq -r '.cost.total_cost_usd // empty')
cost_part=""
if [ -n "$cost_usd" ]; then
cost_fmt=$(echo "$cost_usd" | awk '{
if ($1 < 0.01) printf "%.4f", $1
else printf "%.2f", $1
}')
cost_part="${CYAN}~\$${cost_fmt}${RESET}"
fi
# 5-hour rate limit
five_pct=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
five_resets=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // empty')
five_part=""
if [ -n "$five_pct" ]; then
if [ -n "$five_resets" ]; then
reset_time=$(date -r "$five_resets" "+%H:%M" 2>/dev/null || date -d "@$five_resets" "+%H:%M" 2>/dev/null)
five_part="5h: $(color_pct "$five_pct") → ${reset_time}"
else
five_part="5h: $(color_pct "$five_pct")"
fi
fi
# 7-day rate limit
week_pct=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')
week_resets=$(echo "$input" | jq -r '.rate_limits.seven_day.resets_at // empty')
week_part=""
if [ -n "$week_pct" ]; then
if [ -n "$week_resets" ]; then
week_reset=$(date -r "$week_resets" "+%a %H:%M" 2>/dev/null || date -d "@$week_resets" "+%a %H:%M" 2>/dev/null)
week_part="7d: $(color_pct "$week_pct") → ${week_reset}"
else
week_part="7d: $(color_pct "$week_pct")"
fi
fi
# Assemble line 2
left=""
for part in "$ctx_part" "$cache_part" "$token_part" "$cost_part"; do
if [ -n "$part" ]; then
if [ -n "$left" ]; then left="${left} "; fi
left="${left}${part}"
fi
done
right=""
for part in "$five_part" "$week_part"; do
if [ -n "$part" ]; then
if [ -n "$right" ]; then right="${right} "; fi
right="${right}${part}"
fi
done
line2="$left"
if [ -n "$right" ]; then
if [ -n "$line2" ]; then line2="${line2} | "; fi
line2="${line2}${right}"
fi
printf "%s\n%s\n" "$line1" "$line2"
保存文件后,给脚本添加执行权限:
chmod +x ~/.claude/statusline-command.sh
第二步:修改 Claude Code 配置文件
用文本编辑器打开 ~/.claude/settings.json(如果文件不存在就新建),在最外层的 {} 内加入以下内容:
{
"statusLine": {
"type": "command",
"command": "sh ~/.claude/statusline-command.sh"
}
}
如果文件里已经有其他配置,只需要把 statusLine 这一段加进去,注意 JSON 格式,各字段之间用逗号隔开。例如:
{
"statusLine": {
"type": "command",
"command": "sh ~/.claude/statusline-command.sh"
},
"theme": "dark"
}
第三步:重启 Claude Code
保存配置文件后,重启 Claude Code,状态栏就会出现在界面底部了。
前置依赖:脚本用到了
jq这个命令行工具来解析 JSON。 macOS 用户可以用 Homebrew 安装:brew install jqLinux 用户:sudo apt install jq或sudo yum install jq
方法二:让 Claude Code 自己给自己配置(强烈推荐)
这是最简单、最有意思的方式:让 Claude Code 帮你自动完成整个配置流程。你完全不需要手动创建脚本文件、修改配置文件,只需要告诉它你想要什么。
操作步骤
打开 Claude Code,直接描述你想要的效果,比如:
「帮我配置 Claude Code 的 statusline,第一行显示模型名和当前 git 分支,第二行显示上下文使用百分比和今天还剩多少用量」
Claude Code 会:
- 自动生成适合你需求的脚本
- 把脚本写入
~/.claude/statusline-command.sh - 修改
~/.claude/settings.json配置文件 - 提示你重启 Claude Code
整个过程你不需要碰任何命令行,它会自动完成方法一里的所有步骤。
自定义和迭代
效果不满意?继续描述你的需求,Claude Code 会帮你调整:
「把百分比数字用颜色标记,超过 80% 显示红色」
「加上本次 session 的费用估算」
「去掉 7 天用量,我不关心这个」
不断调整,直到满意为止。整个过程你完全不需要自己写代码、运行命令,只需要描述你想看到什么信息、用什么颜色显示。
为什么推荐这个方法?
- 零门槛:不需要会写 shell 脚本,不需要懂 JSON 格式
- 自动化:从生成脚本到修改配置文件全自动完成
- 可定制:想显示什么、怎么显示,随时调整
- 自举感:用 Claude Code 来配置 Claude Code 自己,确实有点意思
如果你想看懂脚本的工作原理、或者想手动调整细节,再去看方法一的脚本内容。但大多数情况下,这个方法已经够用了。
背后原理(选读)
Claude Code 的 statusline 工作方式很简单:每次界面刷新时,它把当前 session 的状态信息打包成一个 JSON,通过标准输入传给你指定的脚本,脚本输出的文字就显示在状态栏里。
JSON 里包含了几乎所有你关心的数据:
{
"model": { "display_name": "Sonnet 4.6", "id": "claude-sonnet-4-6" },
"context_window": {
"used_percentage": 66,
"total_input_tokens": 12898,
"total_output_tokens": 425059,
"current_usage": {
"cache_read_input_tokens": 132422
}
},
"cost": { "total_cost_usd": 23.21 },
"rate_limits": {
"five_hour": { "used_percentage": 21, "resets_at": 1776970800 },
"seven_day": { "used_percentage": 81, "resets_at": 1777028400 }
}
}
只要会用 jq 读取 JSON 字段,想显示什么就显示什么,完全自由。
小结
配置完之后最大的感受就是:信息一直在那里,焦虑就消失了。
不用中断思路去查用量,不用担心上下文满了没意识到,看一眼状态栏就什么都知道了。
建议你直接用方法二,让 Claude Code 帮你配置,全程只需要聊天描述需求,连命令行都不用碰。整个过程不超过五分钟,之后省下来的注意力是完全值得的。
如果你也试着配了,欢迎在评论区分享你的自定义版本——说不定比我这个更好用。