关注

我给 Claude Code 加了个终端仪表盘,同事看了直接问我怎么装的

兄弟们,我翻车了。

上周用 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

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--