兄弟们,我翻车了。
上周用 Claude Code 改一个项目,改到一半突然发现——上下文早满了,后面几轮对话全是"失忆状态"在输出,质量断崖式下跌。更离谱的是,那天结束一看账单,好家伙,单日干掉了几亿的token。
我心想这不行啊,照这样付费上班下去我得玩完啊,开车还得看仪表盘呢,写代码全凭感觉这也太野了。
后来我研究了一下,发现 Claude Code 其实有个隐藏的statusline功能,能帮你搞一个终端底部的"仪表盘"——模型、目录、Git 分支、token 消耗、缓存命中率、上下文进度条,全给你摆在眼前。
配完之后我的感受就四个字:早该装了。
今天手把手教你们搞定,两种方法,选一个就行,小白也能五分钟上手。
先看看效果
装完之后你的终端底部会长这样:
第一行——你在哪干活:
✦ MODEL mimo-v2.5-pro 📁 DIR ~/data1/htdocs/xxx/golang ⑂ GIT master*
第二行——这轮会话的"油耗":
◔ CTX 16% · ⚡ CACHE 78% · ↕ TOK 31.6k↑ 317↓ · ◷ TIME 9m · 🔔 TIP Review before commit ✨
第三行——上下文进度条,一眼就知道还剩多少:
ctx ▰▰▰▰▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱▱ 16% used
是不是有那味了?接下来讲怎么配。
方法一:直接抄脚本(适合爱动手的兄弟)
第一步:创建脚本文件
mkdir -p ~/.claude touch ~/.claude/statusline.sh chmod +x ~/.claude/statusline.sh把下面的内容粘进去:
#!/usr/bin/env bash # Claude Code 自定义状态栏 # 第一行:模型 / 目录 / Git 分支 # 第二行:上下文 / 缓存 / Token / 时长 / 提醒 # 第三行:上下文进度条 set -u input="$(cat)" # ----------------------------- # 颜色定义 # ----------------------------- RESET="\033[0m" BOLD="\033[1m" DIM="\033[2m" C_TEXT="\033[38;5;230m" C_MUTED="\033[38;5;245m" C_PEACH="\033[38;5;216m" C_GREEN="\033[38;5;114m" C_MINT="\033[38;5;121m" C_BLUE="\033[38;5;117m" C_PURPLE="\033[38;5;183m" C_YELLOW="\033[38;5;221m" C_RED="\033[38;5;203m" BG="\033[48;5;236m" if [ "${NO_COLOR:-}" != "" ]; then RESET=""; BOLD=""; DIM="" C_TEXT=""; C_MUTED=""; C_PEACH=""; C_GREEN=""; C_MINT="" C_BLUE=""; C_PURPLE=""; C_YELLOW=""; C_RED=""; BG="" fi # ----------------------------- # 工具函数 # ----------------------------- jqr() { jq -r "$1" 2>/dev/null <<< "$input" } num() { local v="${1:-0}" [ -z "$v" ] || [ "$v" = "null" ] && v=0 awk -v n="$v" 'BEGIN { printf "%.0f", n + 0 }' 2>/dev/null } fmt_tokens() { local n n="$(num "${1:-0}")" awk -v n="$n" 'BEGIN { if (n >= 1000000) printf "%.1fm", n / 1000000 else if (n >= 1000) { if (n % 1000 == 0) printf "%.0fk", n / 1000 else printf "%.1fk", n / 1000 } else printf "%.0f", n }' } fmt_time() { local ms ms="$(num "${1:-0}")" awk -v ms="$ms" 'BEGIN { s = ms / 1000 if (s < 1) printf "0s" else if (s < 60) printf "%.0fs", s else if (s < 3600) printf "%.0fm", s / 60 else printf "%.1fh", s / 3600 }' } short_dir() { local dir="${1:-$PWD}" [ -n "${HOME:-}" ] && dir="${dir/#$HOME/~}" dir="$(sed -E 's#^/Users/[^/]+#~#; s#^/home/[^/]+#~#' <<< "$dir")" if [ "${#dir}" -gt 36 ]; then basename "$dir" else echo "$dir" fi } git_branch() { local dir="$1" git -C "$dir" rev-parse --is-inside-work-tree >/dev/null 2>&1 || { echo "no-git" return } local b b="$(git -C "$dir" branch --show-current 2>/dev/null)" [ -z "$b" ] && b="$(git -C "$dir" rev-parse --short HEAD 2>/dev/null)" [ -z "$b" ] && b="detached" if [ -n "$(git -C "$dir" status --porcelain 2>/dev/null)" ]; then b="${b}*" fi echo "$b" } top_item() { printf "%b" "${BG} $1$2 $3${RESET}${BG} ${C_TEXT}${BOLD}$4${RESET}${BG} " } metric() { printf "%b" "$1$2 $3${RESET} ${C_TEXT}${BOLD}$4${RESET}" } bar() { local pct width filled empty color out i pct="$(num "${1:-0}")" width="${2:-30}" [ "$pct" -lt 0 ] && pct=0 [ "$pct" -gt 100 ] && pct=100 filled=$((pct * width / 100)) empty=$((width - filled)) color="$C_GREEN" [ "$pct" -ge 60 ] && color="$C_YELLOW" [ "$pct" -ge 80 ] && color="$C_RED" out="" for ((i = 0; i < filled; i++)); do out="${out}▰"; done for ((i = 0; i < empty; i++)); do out="${out}▱"; done printf "%b" "${color}${out}${RESET}" } join_dot() { local first=1 item for item in "$@"; do [ -z "$item" ] && continue if [ "$first" -eq 1 ]; then printf "%b" "$item" first=0 else printf "%b" " ${C_MUTED}·${RESET} $item" fi done } # ----------------------------- # 读取字段 # ----------------------------- model="$(jqr '.model.display_name // "Claude"')" cwd="$(jqr '.workspace.current_dir // .cwd // env.PWD')" ctx_pct="$(num "$(jqr '.context_window.used_percentage // 0' | cut -d. -f1)")" in_tok="$(num "$(jqr '.context_window.total_input_tokens // 0')")" out_tok="$(num "$(jqr '.context_window.total_output_tokens // 0')")" duration_ms="$(num "$(jqr '.cost.total_duration_ms // 0')")" # 缓存命中率估算 cache_read="$(num "$(jqr '.context_window.current_usage.cache_read_input_tokens // 0')")" cache_create="$(num "$(jqr '.context_window.current_usage.cache_creation_input_tokens // 0')")" cache_input="$(num "$(jqr '.context_window.current_usage.input_tokens // 0')")" if [ $((cache_read + cache_create + cache_input)) -gt 0 ]; then cache_pct="$(awk -v r="$cache_read" -v c="$cache_create" -v i="$cache_input" \ 'BEGIN { printf "%.0f", r / (r + c + i) * 100 }')" else cache_pct="0" fi project="$(short_dir "$cwd")" branch="$(git_branch "$cwd")" tokens="$(fmt_tokens "$in_tok")↑ $(fmt_tokens "$out_tok")↓" time_display="$(fmt_time "$duration_ms")" reminder="${CLAUDE_STATUS_REMINDER:-Review before commit ✨}" # ----------------------------- # 输出三行状态栏 # ----------------------------- line1="" line1+="$(top_item "$C_PEACH" "✦" "MODEL" "$model") " line1+="$(top_item "$C_GREEN" "📁" "DIR" "$project") " line1+="$(top_item "$C_PURPLE" "⑂" "GIT" "$branch")" ctx_item="$(metric "$C_MINT" "◔" "CTX" "${ctx_pct}%")" cache_item="$(metric "$C_YELLOW" "⚡" "CACHE" "${cache_pct}%")" tok_item="$(metric "$C_GREEN" "↕" "TOK" "$tokens")" time_item="$(metric "$C_BLUE" "◷" "TIME" "$time_display")" tip_item="$(metric "$C_PEACH" "🔔" "TIP" "$reminder")" line2="$(join_dot "$ctx_item" "$cache_item" "$tok_item" "$time_item" "$tip_item")" printf "%b\n" "$line1" printf "%b\n" "$line2" printf "%b\n" "${DIM}ctx ${RESET}$(bar "$ctx_pct" 30) ${C_MUTED}${ctx_pct}% used${RESET}"第二步:配置 settings.json
编辑~/.claude/settings.json,加上这段:
{ "statusLine": { "type": "command", "command": "~/.claude/statusline.sh", "padding": 0, "refreshInterval": 5 } }refreshInterval是刷新间隔,单位秒,我设的 5 秒,你们按自己喜好调。
重启 Claude Code,搞定。
方法二:让 Claude 自己配(懒人福音,强烈推荐)
这个方法是真的爽——你连脚本都不用写。
打开 Claude Code,直接输入:
/statusline它会自动帮你装一个默认的状态栏,默认效果就挺不错的:
但这还不够,你可以用自然语言告诉它你想要啥样的:
/statusline 基于当前状态栏,想要调整下: 1.删除用户名 2.增加显示:模型名称、token输入输出量、缓存、上下文进度条 3.调整:目录和git分支名可以分开。可以分1~2行展示 整体配色优雅好看一点它真的能听懂人话。
不用研究文档,不用手搓脚本,不用去 GitHub 上找第三方方案。觉得哪里不满意?继续用自然语言让它改,改到你满意为止。
这不比你自己 debug 脚本强一万倍?
进阶玩法:先让 ChatGPT 出设计稿
如果你想要更好看的效果,可以先让 ChatGPT 帮你出一张 UI 设计图:
帮我设计一个好看的 Claude Code 状态栏 UI 图稿,简洁清雅好看一些:尽量不要全部拥挤在一行,可以根据功能分类规整 2~3 行
然后再让 ChatGPT 根据设计稿生成 Claude Code 的 statusline prompt,把 prompt 喂给 Claude Code 就行。
最终效果我直接上图,超喜欢的:
而且我还给上下文进度条做了不同使用率的配色——绿色安全、黄色注意、红色快满了:
这个设计是真的实用,再也不用每隔一会儿就敲命令查上下文了,扫一眼就知道。
不想要了?一键删除
/statusline delete完事。
最后说两句
配完这个状态栏之后,我最大的感受就是:信息一直在那,但以前你看不到。
上下文快满了你不知道,token 烧了多少你没数,缓存命中率高不高你不清楚。现在全摆在终端底部了,扫一眼就心里有数,写代码思路也不会被打断。
我建议直接用方法二,让 Claude Code 帮你配,全程聊天,连终端命令都不用敲。整个过程不超过五分钟,但之后省下来的注意力和 token 费用,远超这五分钟。
Claude Code 用得越深,越觉得它不只是个聊天写代码的工具,而是一个可以被你持续改造的开发环境。
你们也去试试,配出来的效果发评论区,说不定比我的还好看。
我是赛博李同学大厂写代码的,觉得有用的话,点个赞 + 转发给需要的TA,感谢支持!,我们下期再见!