Claude Code 状态列完全攻略:context 用量、费用、git 分支一眼看完

你的 Claude Code 底部是不是空空的,什么信息都没有?context 吃到多少、花了多少钱,完全不知道,得手动打 /context/cost 才看得到。今天教你把底部变成一个完整的信息面板——彩色 context 进度条、费用追踪、git 分支状态,全部一眼看完。

一、最终成品

先看一下最终效果。上面那行显示当前模型、文件夹名称、git 分支,下面那行是一个彩色的 context 进度条,绿色是安全、黄色是注意、红色是快爆了,旁边还有费用和经过时间。

整个东西就是一个 bash 脚本在跑,Claude Code 每次回复完就会自动更新一次。而且它跑在本机,不吃 API token。

二、一行指令搞定(/statusline)

最快的方法,连脚本都不用写。Claude Code 有一个 /statusline 指令,直接用自然语言告诉它你要什么,它就自动帮你生脚本、改设定,一次搞定。

Claude Code
/statusline show model name and context percentage with a progress bar

它会自动在 ~/.claude/ 底下生一个脚本文件,然后帮你把 settings.json 也改好。下次跟 Claude Code 互动的时候,底部就会出现状态列了。

也可以用中文描述,像是「显示模型名称跟 context 百分比加上进度条」,它都听得懂。想删掉的话,打 /statusline clear 就行了。

注意:这个指令没办法精确控制颜色跟格式,而且它生出来的脚本有时候会出问题你还不知道原因。接下来教你自己写,其实就 10 行代码,但你会完全理解它在干嘛,坏了也自己修得好。

三、手动写脚本

原理很简单:Claude Code 会把 session 的数据用 JSON 格式丢给你的脚本,你的脚本读这个 JSON、抓你要的字段、打印出来,Claude Code 就会把你打印出来的东西显示在底部。

建立脚本文件

建一个 bash 文件在 ~/.claude/ 底下:

Bash
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

echo "[$MODEL] ${DIR##*/} | ${PCT}% context"

逐行说明:

  • input=$(cat) — 读 Claude Code 通过 stdin 管道传进来的 JSON
  • jq 抓里面的字段:MODEL 抓模型名称,DIR 抓工作目录,PCT 抓 context 百分比
  • // 0 是防呆,如果字段是 null 就给 0;cut -d. -f1 把小数点砍掉只留整数
  • ${DIR##*/} 是 bash 语法,把路径前面全部砍掉只留最后的文件夹名称

前置条件:这里用到 jq,如果你的 Mac 还没装,先跑一下 brew install jq。这步很多人会忘记,结果脚本跑不起来还以为是 Claude Code 的问题。

让脚本可执行

Bash
chmod +x ~/.claude/statusline.sh

修改 Claude Code 设定

编辑 ~/.claude/settings.json,加入以下内容:

JSON
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  },

type 设成 "command" 代表「跑这个 shell 指令」,command 就是指向你的脚本路径。如果 settings.json 里面已经有其他设定,不要整个换掉,把 statusLine 这段加进去就好。

排错检查清单:如果状态列没出现,检查三件事:脚本有没有 chmod +x、脚本是不是打印到 stdout 而不是 stderr、settings.json 里面 disableAllHooks 是不是被设成 true(这个设定会连状态列一起关掉)。还是搞不定的话,跑 claude --debug 可以看到错误信息。

四、加上 Git 状态和颜色

加 git 分支信息,而且用颜色标示哪些文件已经 staged、哪些还没 commit。绿色 +2 代表有 2 个文件 staged,黄色 ~3 代表有 3 个文件改了还没加。

Bash
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')

GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'

if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
    MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

    GIT_STATUS=""
    [ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"
    [ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"

    echo -e "[$MODEL] ${DIR##*/} | $BRANCH $GIT_STATUS"
else
    echo "[$MODEL] ${DIR##*/}"
fi

那些 \033[32m\033[33m 是终端的 ANSI 颜色码。32 是绿色、33 是黄色,\033[0m 是重置回默认颜色。echo -e 是让 bash 解析这些转义字符。

2>/dev/null 是把错误信息丢掉不显示,这样就算指令出错也不会把错误打印在状态列上面。git rev-parse 先检查你当前在不在 git repo 里面,如果不是就只显示模型和文件夹。

五、多行显示 + 彩色进度条 + 费用追踪

这个组合技才是每天实际在用的版本。上面那行放模型、文件夹、git 分支,下面那行放 context 进度条加费用跟时间。进度条会自动变色:context 用不到 70% 是绿色,70 到 89% 变黄色,90% 以上直接变红色。

Bash
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))
BAR=$(printf "%${FILLED}s" | tr ' ' '█')$(printf "%${EMPTY}s" | tr ' ' '░')

MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | $(git branch --show-current 2>/dev/null)"

echo -e "${CYAN}[$MODEL]${RESET} ${DIR##*/}$BRANCH"
COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ${MINS}m ${SECS}s"

关键部分说明:

  • 先判断百分比,90 以上用红色、70 以上用黄色、其他用绿色
  • printftr 组出进度条, 是填满的格子, 是空的格子,一共 10 格
  • 两个 echo 就是多行的做法,每一个 echo 就是一行,Claude Code 会把它们分成两行显示在底部
  • cost.total_cost_usd 是这个 session 到目前为止花了多少美金,total_duration_ms 是经过了多少毫秒

用模拟数据测试

可以用模拟数据测试脚本,不用真的开 Claude Code:

Bash
echo '{"model":{"display_name":"Opus"},"context_window":{"used_percentage":75},"cost":{"total_cost_usd":0.52,"total_duration_ms":180000},"workspace":{"current_dir":"/Users/matt/my-project"}}' | ~/.claude/statusline.sh

75% 所以进度条是黄色的,费用 $0.52,经过 3 分钟。把 used_percentage 改成 95 试试看,进度条就会变红色。

六、进阶:可点击的链接

如果你用 iTerm2、Kitty 或 WezTerm 这些终端,可以在状态列里面放 GitHub 链接,Cmd+click 就能直接打开你的 repo 页面:

Bash
REMOTE=$(git remote get-url origin 2>/dev/null | sed 's/git@github.com:/https:\/\/github.com\//' | sed 's/\.git$//')
REPO_NAME=$(basename "$REMOTE")
printf '%b' "\e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a"

\e]8;; 是 OSC 8 的转义序列,终端看到这个就知道中间的文字是可以点的超链接。注意用 printf '%b' 不要用 echo -e,跨平台兼容性比较好。

七、状态列更新机制

状态列什么时候更新?以下三种情况会触发:

  • 每次 Claude Code 回复完
  • 切换 permission mode 的时候
  • 切换 vim mode 的时候

而且它有做防抖,连续触发的话会等 300 毫秒才跑,不会一直疯狂执行。如果你改了脚本,要等下次跟 Claude Code 互动才会生效。

八、JSON 字段速查表

字段 说明 jq 路径
模型名称 当前使用的模型 .model.display_name
工作目录 当前项目路径 .workspace.current_dir
Context 百分比 Context window 使用率 .context_window.used_percentage
累计费用 Session 总费用(美元) .cost.total_cost_usd
经过时间 Session 持续毫秒数 .cost.total_duration_ms