你的 Claude Code 底部是不是空空的,什么信息都没有?context 吃到多少、花了多少钱,完全不知道,得手动打 /context 或 /cost 才看得到。今天教你把底部变成一个完整的信息面板——彩色 context 进度条、费用追踪、git 分支状态,全部一眼看完。
一、最终成品
先看一下最终效果。上面那行显示当前模型、文件夹名称、git 分支,下面那行是一个彩色的 context 进度条,绿色是安全、黄色是注意、红色是快爆了,旁边还有费用和经过时间。
整个东西就是一个 bash 脚本在跑,Claude Code 每次回复完就会自动更新一次。而且它跑在本机,不吃 API token。
二、一行指令搞定(/statusline)
最快的方法,连脚本都不用写。Claude Code 有一个 /statusline 指令,直接用自然语言告诉它你要什么,它就自动帮你生脚本、改设定,一次搞定。
/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/ 底下:
#!/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 的问题。
让脚本可执行
chmod +x ~/.claude/statusline.sh修改 Claude Code 设定
编辑 ~/.claude/settings.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 个文件改了还没加。
#!/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% 以上直接变红色。
#!/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 以上用黄色、其他用绿色
- 用
printf和tr组出进度条,█是填满的格子,░是空的格子,一共 10 格 - 两个
echo就是多行的做法,每一个echo就是一行,Claude Code 会把它们分成两行显示在底部 cost.total_cost_usd是这个 session 到目前为止花了多少美金,total_duration_ms是经过了多少毫秒
用模拟数据测试
可以用模拟数据测试脚本,不用真的开 Claude Code:
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.sh75% 所以进度条是黄色的,费用 $0.52,经过 3 分钟。把 used_percentage 改成 95 试试看,进度条就会变红色。
六、进阶:可点击的链接
如果你用 iTerm2、Kitty 或 WezTerm 这些终端,可以在状态列里面放 GitHub 链接,Cmd+click 就能直接打开你的 repo 页面:
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 |