兄弟们,我翻车了。
上周用 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,感谢支持!,我们下期再见!
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/lianxiyang/article/details/161123267



