再也不用 /usage 了!用 Claude Code 自定义状态栏,把用量焦虑彻底消灭

3 阅读5分钟

再也不用 /usage 了!用 Claude Code 自定义状态栏,把用量焦虑彻底消灭

前言:你是否也有这种焦虑?

用 Claude Code 写代码的时候,你有没有遇到过这种情况:

写到一半突然想起来——上下文快满了吗?今天的用量还剩多少?于是打断自己的思路,输入 /usage,等弹窗出来,瞄一眼,关掉,继续写。

每隔一段时间就来一次,完全打断心流。更难受的是有时候忘了查,等模型开始"变笨"了才意识到上下文已经快满了,或者用量已经到限制了。

后来我发现 Claude Code 其实内置了一个 statusline(状态栏) 功能,可以把你关心的所有信息一直显示在屏幕底部,完全不用再主动查了。配置好之后,那种用量焦虑几乎消失了。

这篇文章分享我的配置方案,以及如何一步一步配出来。


效果展示

配置完成后,Claude Code 界面底部会出现两行状态信息,长这样:

statusline 效果图

第一行 显示的是当前环境信息:

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:005 小时滚动用量,以及用量重置时间
7d: 81% → Thu 00:007 天用量,以及下次重置时间

颜色含义:

  • 🟢 绿色:用量低,不用担心
  • 🟡 黄色:用量中等,留意一下
  • 🔴 红色:用量较高,注意控制

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 jq Linux 用户:sudo apt install jqsudo yum install jq


方法二:让 Claude Code 自己给自己配置(强烈推荐)

这是最简单、最有意思的方式:让 Claude Code 帮你自动完成整个配置流程。你完全不需要手动创建脚本文件、修改配置文件,只需要告诉它你想要什么。

操作步骤

打开 Claude Code,直接描述你想要的效果,比如:

「帮我配置 Claude Code 的 statusline,第一行显示模型名和当前 git 分支,第二行显示上下文使用百分比和今天还剩多少用量」

Claude Code 会:

  1. 自动生成适合你需求的脚本
  2. 把脚本写入 ~/.claude/statusline-command.sh
  3. 修改 ~/.claude/settings.json 配置文件
  4. 提示你重启 Claude Code

整个过程你不需要碰任何命令行,它会自动完成方法一里的所有步骤。

自定义和迭代

效果不满意?继续描述你的需求,Claude Code 会帮你调整:

「把百分比数字用颜色标记,超过 80% 显示红色」
「加上本次 session 的费用估算」
「去掉 7 天用量,我不关心这个」

不断调整,直到满意为止。整个过程你完全不需要自己写代码、运行命令,只需要描述你想看到什么信息、用什么颜色显示。

为什么推荐这个方法?

  1. 零门槛:不需要会写 shell 脚本,不需要懂 JSON 格式
  2. 自动化:从生成脚本到修改配置文件全自动完成
  3. 可定制:想显示什么、怎么显示,随时调整
  4. 自举感:用 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 帮你配置,全程只需要聊天描述需求,连命令行都不用碰。整个过程不超过五分钟,之后省下来的注意力是完全值得的。

如果你也试着配了,欢迎在评论区分享你的自定义版本——说不定比我这个更好用。