Claude Code Status Line 自定义指南:从配不对颜色到终于看清

发布于 2026年05月31日 21:00 #Claude#CLI

Claude Code Status Line 自定义指南:从配不对颜色到终于看清 封面图

故事是这样的。前几天我在 Claude Code 里问了一句「为什么我看不到 token 统计」,然后花了一个多小时折腾配色。

不是写代码费时间——是在「调亮一点」「更看不清楚了」「换个配色方案」「还是看不清」之间反复了四五轮。

最后发现,问题根本不在亮不亮,而在我选错了颜色体系

这篇不只是一篇教程。它是你自定义 Status Line 时的避坑地图——我把所有走错的路都标出来了。

Status Line 是什么

Claude Code 底部有一条状态栏,默认显示目录名、Git 分支、模型名、上下文剩余百分比等信息。它本质上是 Claude Code 每轮对话后,把一个 JSON 数据结构通过 stdin 管道传给一个自定义脚本,脚本输出什么字符串,状态栏就显示什么

配置在 ~/.claude/settings.json 里:

{
  "statusLine": {
    "command": "sh ~/.claude/statusline.sh",
    "padding": 0,
    "refreshInterval": 10,
    "type": "command"
  }
}

type: "command" 表示执行外部命令,脚本的 stdin 会收到一个完整的 JSON 对象。脚本只需要往 stdout 输出一段带 ANSI 颜色编码的文本即可。

你也可以直接使用社区维护的 npm 包 ccstatuslinenpx -y ccstatusline@latest — 内置多种主题和配置选项,开箱即用。我现在实际用的就是它,省去了自己维护脚本的麻烦。

你面前有什么数据

这是脚本收到的 JSON 结构(节选我实际 dump 到的数据):

{
  "workspace": { "current_dir": "/Users/ruofeng/..." },
  "model": { "display_name": "deepseek-v4-flash-260425" },
  "context_window": {
    "total_input_tokens": 322493,
    "total_output_tokens": 8124,
    "context_window_size": 200000,
    "current_usage": {
      "input_tokens": 355,
      "output_tokens": 66
    },
    "used_percentage": 23,
    "remaining_percentage": 77
  }
}

关键字段

字段含义
workspace.current_dir当前工作目录
model.display_name模型名称
context_window.total_input_tokens当前会话累计输入 token 数
context_window.total_output_tokens累计输出 token 数
context_window.context_window_size上下文窗口上限(通常 200K)
context_window.used_percentage已用上下文百分比
context_window.remaining_percentage剩余百分比
context_window.current_usage.input_tokens最近一轮输入 token 数
context_window.current_usage.output_tokens最近一轮输出 token 数

第一个坑:猜字段名

我当时没去 dump 实际数据结构,直接凭经验猜了几个字段名:context_window.tokens_usedcontext_window.max_tokens

结果全为空。

如果你用了一下午折腾脚本但啥也没显示,大概率是字段名错了。正确的做法是先 dump 原始 JSON:

# 临时改一下 statusLine command
"command": "sh -c 'cat > /tmp/status_debug.json'"

重启一次,看看实际收到了什么。我就是这么干的,然后才发现字段名跟我猜的完全不同。

第二个坑:以及更大的坑——颜色

脚本逻辑本身很简单:用 jq 解析 JSON,拼 ANSI 颜色码,printf 输出。我写完功能部分后,决定把颜色弄得好看一点。

因为我的终端用的是 Catppuccin Mocha 主题,我挑了它的 Peach、Yellow、Green、Lavender、Pink 五色,转成 RGB 后用 24-bit ANSI 编码:

# Catppuccin Mocha 色板(好看但容易看不清)
PEACH='\033[38;2;250;179;135m'
YELLOW='\033[38;2;249;226;175m'
GREEN='\033[38;2;166;227;161m'

结果就是一连串的翻车:

  1. 第一版:颜色太浅 → 调亮 RGB 值
  2. 第二版:更看不清楚 → 加 1; 粗体
  3. 第三版:还是看不清 → 换回标准 ANSI 16 色调色板——这次终于看清了

问题根因很直接:Catppuccin Mocha 的配色本身就是低对比度的柔和色板,适合 GUI 界面里的装饰元素,但终端状态栏不是装饰——你需要在一两秒内扫到关键信息。RGB 24-bit 颜色的中低亮度区域在深色背景上对比度不足,即使用了粗体,观感还是糊。

最终的配色方案反而最简单:

# 终端标准 16 色调色板 + 粗体
DIR_COLOR='\033[1;36m'     # 青色
BRANCH_COLOR='\033[1;33m'  # 黄色
MODEL_COLOR='\033[1;32m'   # 绿色
TOKEN_COLOR='\033[1;35m'   # 品红
INFO_COLOR='\033[1;37m'    # 白色

这些是终端内置的标准色。不管你是 Mocha、Dracula、Nord 还是 Solarized,它们都被映射到终端主题里最高对比度的那几个位置。1; 再加粗,可读性拉满。

成品

这是我的最终脚本 ~/.claude/statusline.sh

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

cwd=$(echo "$input" | jq -r '.workspace.current_dir')
model=$(echo "$input" | jq -r '.model.display_name')
total_in=$(echo "$input" | jq -r '.context_window.total_input_tokens // empty')
total_out=$(echo "$input" | jq -r '.context_window.total_output_tokens // empty')
remaining=$(echo "$input" | jq -r '.context_window.remaining_percentage // empty')

dir_short=$(basename "$cwd")

git_branch=""
if git -C "$cwd" --no-optional-locks rev-parse --git-dir > /dev/null 2>&1; then
    git_branch=$(git -C "$cwd" --no-optional-locks branch --show-current 2>/dev/null || "")
fi

# 格式化大数字:322493 → 322.4K(保留一位小数)
format_num() {
    local n=$1
    if [ "$n" -ge 1000000 ]; then
        echo "scale=1; $n / 1000000" | bc | sed 's/\.0$//' | sed 's/$/M/'
    elif [ "$n" -ge 1000 ]; then
        echo "scale=1; $n / 1000" | bc | sed 's/\.0$//' | sed 's/$/K/'
    else
        echo "$n"
    fi
}

DIR_COLOR='\033[1;36m'     # 青色 - 目录
BRANCH_COLOR='\033[1;33m'  # 黄色 - Git 分支
MODEL_COLOR='\033[1;32m'   # 绿色 - 模型名称
TOKEN_COLOR='\033[1;35m'   # 品红 - token 统计
INFO_COLOR='\033[1;37m'    # 白色 - 百分比
RESET='\033[0m'

printf "${DIR_COLOR}${dir_short} "
[ -n "$git_branch" ] && printf "${BRANCH_COLOR}${git_branch} "
printf "${MODEL_COLOR}${model} "
if [ -n "$total_in" ]; then
    in_fmt=$(echo "scale=1; $total_in / 1000" | bc | sed 's/\.0$//')K
    printf "${TOKEN_COLOR}${in_fmt} "
fi
if [ -n "$total_out" ]; then
    out_fmt=$(echo "scale=1; $total_out / 1000" | bc | sed 's/\.0$//')K
    printf "${MODEL_COLOR}↩${out_fmt} "
fi
[ -n "$remaining" ] && printf "${INFO_COLOR}${remaining}%%"
printf "${RESET}"

效果是:

tech-blog main deepseek-v4-flash-260425 322.4K ↩8.1K 77%

青色是目录,黄色是分支,绿色是模型,品红是输入 token 数, 前缀的绿色数字是累计输出 token 数,白色是剩余百分比。一眼前就能定位到自己要看的信息。

还能加什么

JSON 里还有 context_window.total_output_tokenscurrent_usage(最近一轮的 input/output),你可以按需加到状态栏:

  • 显示缓存命中:cache_read_input_tokens
  • 显示上下文压力:used_percentage
  • 显示会话耗时:session_duration_seconds

我现在的实际配置

上面那个脚本是我折腾过程的产物,但现在日常用的其实是社区包 ccstatusline。settings.json 里的配置是:

{
  "statusLine": {
    "command": "npx -y ccstatusline@latest",
    "padding": 0,
    "refreshInterval": 10,
    "type": "command"
  }
}

ccstatusline 默认输出两行信息:

tech-blog main 8.1k Ctx Used: 23.0%
Model: deepseek-v4-flash-260425

第一行是目录、Git 分支、输出 token 数、上下文使用率;第二行是模型名称。它内置了色彩方案和 Powerline 风格支持,比我那个手写脚本丰富得多。

ccstatusline 提供了一个交互式 TUI,可以可视化地增删 widget、调整颜色主题、修改分隔符样式。但即便是默认配置,开箱即用的体验已经足够好。

# Run the configuration TUI with npm
npx -y ccstatusline@latest

# Or with Bun (faster)
bunx -y ccstatusline@latest

实际效果图

之所以从自定义脚本切到 ccstatusline,主要原因是它帮我省去了维护工作:社区在持续更新,不断新增 widget(比如 Git PR 状态、会话压缩计数、API 速率限制),而我不用自己写一行代码。

一点感想

折腾完这个状态栏,我最大的收获不是脚本本身——它也就 30 行。

真正学到的就两件事:

  1. 先看数据结构再写代码。花五分钟 dump 原始 JSON,省的是半小时的试错。这个道理在哪都适用。
  2. 终端配色不要选好看的,要选能看清的。Catppuccin、Dracula 这些主题在 GUI 里很漂亮,但终端状态栏不是 UI 设计——它是以信息获取效率为唯一目标的。标准 16 色调色板被用了三十多年不是因为它老,而是因为它管用。

评论互动

© 2026 王若风的技术博客 · Powered by Astro