最近在折腾终端开发工具时,发现原生的状态栏信息展示总是差点意思。要么是关键数据(比如 API 成本和上下文占用)藏着掖着,要么是显示一大堆没用的零值,挤占了宝贵的屏幕空间。为了解决这个痛点,我用 Bash 写了一个不到 100 行的轻量级脚本,专门用来优化 Antigravity CLI 的状态栏配置。用下来感觉体验提升非常大,今天就分享给各位兄弟。

这个脚本解决了什么痛点?

平时我们在终端里调用 AI 模型,最关心的无非就是几件事:花了多少钱?Token 够不够用?甚至当前在哪个 Git 分支上写代码? 原始的输出往往是一大坨 JSON,或者干脆只有简单的“Done”。这个脚本通过管道处理 STDIN,把这些枯燥的数据变成了一个直观的、自适应的状态栏。

它的核心优势在于:

  1. 智能省流:它会自动隐藏那些没有数据的指标。比如你没绑定计费计划,它就不会显示“费用 $0.00”,保持界面极简清爽。
  2. 大数值自动换算:Token 数动辄几十万甚至上百万,直接看数字容易眼晕。脚本内置了格式化逻辑,自动将 1500 显示为 1.50K,1000000 显示为 1.00M,一目了然。
  3. Git 环境集成:这对我来说是最实用的功能。它能自动读取当前工作目录下的 Git 分支名,直接显示在状态栏里,再也不用在写代码切分支时忘记自己在哪了。
  4. 上下文可视化:不仅告诉你用了多少百分比,还会直接换算出该模型的总上下文容量(比如 1.05M),让你对还能聊多少字心里有底。

依赖与准备工作

在跑脚本之前,你的环境里得有 jq。这是一个处理 JSON 的神器,大部分 Linux 和 macOS 用户应该都有,如果没有,安装也非常简单:

  • Mac (Homebrew): brew install jq
  • Ubuntu/Debian: sudo apt-get install jq

此外,脚本调用了本地的 git 命令,确保你的终端里能用 git 即可。

Bash脚本代码示例,展示了如何使用jq处理JSON数据并格式化输出。

核心脚本代码:使用jq提取数据并格式化状态栏输出

核心脚本代码与原理解析

把下面的代码保存为 status.sh(或者你喜欢的名字),然后赋予执行权限 chmod +x status.sh

#!/bin/bash

![终端状态栏效果图,显示模型名称、Git分支、上下文占用及费用等信息。](/media-load/019f0895-74c7-70f3-90eb-5207f2531650)

*状态栏配置效果:直观展示 Token、成本及 Git 分支信息*

# 读取标准输入的数据流
INPUT=$(cat)

# 利用 jq 一次性提取和格式化字段,减少 fork 开销提升性能
eval "$(jq -r '
def format_tokens(val):
  if (val == null or val == 0) then "0"
  else
    (val | tonumber) as $n |
    if $n >= 1000000000 then "\(( ($n / 1000000000 * 100 | round) / 100 ))B"
    elif $n >= 1000000 then "\(( ($n / 1000000 * 100 | round) / 100 ))M"
    elif $n >= 1000 then "\(( ($n / 1000 * 100 | round) / 100 ))K"
    else "\($n)"
    end
  end;
{
  model: (.model.display_name // "Unknown"),
  cost: (.cost.total_cost_usd // 0),
  context_pct: (.context_window.used_percentage // 0),
  context_size: format_tokens(.context_window.context_window_size // 0),
  limit_pct: (.rate_limits.five_hour.used_percentage // .rate_limits.seven_day.used_percentage // null),
  in_tokens: format_tokens(.context_window.total_input_tokens // 0),
  out_tokens: format_tokens(.context_window.total_output_tokens // 0),
  cwd: (.cwd // ""),
  agent: (.agent.name // ""),
  plan_tier: (.plan_tier // "")
} | [\
  @sh "MODEL=\(.model)",\
  @sh "COST=\(.cost)",\
  @sh "CONTEXT_PCT=\(.context_pct)",\
  @sh "CONTEXT_SIZE_FMT=\(.context_size)",\
  @sh "LIMIT_PCT=\(.limit_pct)",\
  @sh "IN_TOKENS_FMT=\(.in_tokens)",\
  @sh "OUT_TOKENS_FMT=\(.out_tokens)",\
  @sh "CWD=\(.cwd)",\
  @sh "AGENT=\(.agent)",\
  @sh "PLAN_TIER=\(.plan_tier)"\
] | join("\n")
' <<< "$INPUT")"

# 格式化上下文百分比
CONTEXT_FMT=$(LC_NUMERIC=C printf "%.2f" "$CONTEXT_PCT" 2>/dev/null || echo "$CONTEXT_PCT")

# 动态获取 Git 分支名
BRANCH=""
if [ -n "$CWD" ] && [ "$CWD" != "null" ] && [ -d "$CWD" ]; then
  BRANCH=$(git -C "$CWD" rev-parse --abbrev-ref HEAD 2>/dev/null)
fi

# 构建分支和代理信息
INFO=""
if [ -n "$BRANCH" ] && [ "$BRANCH" != "null" ]; then
  INFO="$INFO │ 🌿 $BRANCH"
fi
if [ -n "$AGENT" ] && [ "$AGENT" != "null" ]; then
  INFO="$INFO (👤 $AGENT)"
fi

# 构建账号方案等级显示
PLAN_PART=""
if [ -n "$PLAN_TIER" ] && [ "$PLAN_TIER" != "null" ]; then
  PLAN_PART=" │ 🏆 $PLAN_TIER"
fi

# 格式化并条件性显示费用(去除多余尾零)
COST_PART=""
if [ -n "$COST" ] && [ "$COST" != "0" ] && [ "$COST" != "null" ]; then
  COST_FMT=$(LC_NUMERIC=C printf "%.6f" "$COST" 2>/dev/null | sed -E 's/(\.[0-9]*[1-9])0+$/\1/; s/\.0+$//' || echo "$COST")
  COST_PART=" │ 💰 $COST_FMT"
fi

# 动态配额提示或静态限制提示
QUOTA_PART=""
if [ -n "$LIMIT_PCT" ] && [ "$LIMIT_PCT" != "null" ]; then
  LIMIT_FMT=$(LC_NUMERIC=C printf "%.2f" "$LIMIT_PCT" 2>/dev/null || echo "$LIMIT_PCT")
  QUOTA_PART=" │ 📊 Quota: $LIMIT_FMT%"
else
  # 根据不同的账号方案预设限制提示
  if [ "$PLAN_TIER" = "Google AI Pro" ]; then
    QUOTA_PART=" │ ⚠️ Limit: 15 RPM / 1.5K RPD"
  elif [ "$PLAN_TIER" = "Google AI Studio" ]; then
    QUOTA_PART=" │ ⚠️ Limit: 360 RPM / 4M TPM"
  fi
fi

# 打印最终格式化输出
printf "🤖 %s%s │ 🧠 Context: %s%% / %s │ In: %s │ Out: %s%s%s%s\n" \
  "$MODEL" "$INFO" "$CONTEXT_FMT" "$CONTEXT_SIZE_FMT" "$IN_TOKENS_FMT" "$OUT_TOKENS_FMT" \
  "$PLAN_PART" "$COST_PART" "$QUOTA_PART"

如何集成到配置中?

这个脚本设计得很通用,只要有配置项允许自定义状态行(statusLine),基本都能用。通常你需要把脚本的路径填入配置文件中。以 Antigravity 为例,你需要在 config 文件中找到 statusLine 或者类似的配置项,将其指向这个 bash 脚本。

例如,你的配置可能长这样(伪代码示意):

{
  "statusLine": "~/.config/antigravity/status.sh"
}

配置完成后,重启你的终端或 CLI 工具,再次发起请求,你就能看到类似下面的效果:

🤖 Gemini Pro │ 🌿 feature/login (👤 dev) │ 🧠 Context: 12.50% / 2.00M │ In: 2.15K │ Out: 850 │ 🏆 Google AI Pro │ 💰 0.000421 │ ⚠️ Limit: 15 RPM / 1.5K RPD

一些使用上的小贴士

脚本里的 Git 分支检测依赖于 cwd(当前工作目录)字段。如果你的 CLI 工具没有把 cwd 传给脚本,那一部分显示就会缺失,可以检查一下输入数据的 JSON 结构。

另外,脚本末尾针对 Google AI ProGoogle AI Studio 做了特殊的限额提示硬编码。如果你用的是其他厂商的模型,可以修改脚本的 else 部分,加上对应的 RPM/TPM 限制提醒,这样能更直观地防止触发 429 Too Many Requests 错误。

这个方案虽然简单,但在高频开发场景下,能省去不少回头查账单和看 Context 的精力。如果有更好的优化思路,欢迎在评论区交流!

标签: none

评论已关闭