Claude Code Status Line 設定教學:在終端機即時監控 Context 用量與 Rate Limit
前言 用 Claude Code 開發一段時間後,你應該有遇過這種狀況:聊到一半突然被壓縮 Context,或是 Rate Limit 不知不覺就被吃光了,等到 Claude Code 跟你說「你需要等一下」的時候才知道。
以我自己來講,之前就常常遇到 Context 突然被壓縮,然後 Claude 就忘記前面講過的東西,又要重新解釋一次,真的滿浪費時間的。歸根究底就是因為 Claude Code 預設不會在畫面上顯示這些資訊,你根本不知道目前 Context 還剩多少、Rate Limit 用了多少。
不過 Claude Code 其實有一個內建的功能叫做 Status Line,可以讓你在終端機底部即時顯示這些資訊,像是目前使用的 Model、Context 使用百分比、5 小時和 7 天的 Rate Limit 用量等等,設定完之後就不用再猜了,那這篇就來帶大家了解怎麼設定吧。
Status Line 是什麼? 簡單來講,Status Line 就是終端機底部的一行狀態列,它會即時顯示你目前 Claude Code Session 的相關資訊。
運作原理也很直覺:Claude Code 會把目前 Session 的資料以 JSON 格式,透過 stdin 傳給你指定的 Script,然後你的 Script 負責解析這些資料並輸出一行文字,Claude Code 就會把這行文字顯示在終端機底部。
簡單來講就是 Claude Code 負責提供資料,你想顯示什麼就自己寫 Script 決定。
能顯示哪些資訊? Claude Code 傳給 Script 的 JSON 資料包含以下欄位:
分類
欄位
說明
Model
model.display_name
模型顯示名稱,例如 Opus 4.6 (1M context)
Model
model.id
模型 ID,例如 claude-opus-4-6
Context
context_window.used_percentage
Context 已使用百分比
Context
context_window.remaining_percentage
Context 剩餘百分比
Context
context_window.context_window_size
Context 總大小
Rate Limit
rate_limits.five_hour.used_percentage
5 小時用量百分比
Rate Limit
rate_limits.seven_day.used_percentage
7 天用量百分比
Rate Limit
rate_limits.five_hour.reset_at
5 小時重置時間
Rate Limit
rate_limits.seven_day.reset_at
7 天重置時間
Cost
cost.total_cost_usd
本次 Session 總花費(USD)
Cost
cost.total_duration_ms
Session 總時長
Git
git.branch
目前的 Git 分支
其他
cwd
目前的工作目錄
其他
version
Claude Code 版本
Note Rate Limit 相關的欄位只有 Claude.ai Pro/Max 訂閱用戶才會有資料,如果你是用 API Key 登入的話,這些欄位會是空的。
最快的設定方式 如果你不想自己寫 Script,Claude Code 有提供一個很方便的指令,直接在 Claude Code 的輸入框輸入:
1 /statusline 顯示 model name、context 剩餘百分比、5h 和 7d rate limit 使用百分比
Claude Code 就會自動幫你產生 Script 並寫入設定,完全不用手動處理,非常方便。
執行完之後,Claude Code 會幫你產生一個類似 p10k 風格的預設 Script,大概長這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #!/bin/sh input=$(cat ) cwd=$(echo "$input " | jq -r '.workspace.current_dir // .cwd // ""' ) short_dir=$(echo "$cwd " | sed "s|^$HOME |~|" ) git_branch="" if [ -d "$cwd /.git" ] || git -C "$cwd " rev-parse --git-dir > /dev/null 2>&1; then git_branch=$(git -C "$cwd " -c core.useBuiltinFSMonitor=false symbolic-ref --short HEAD 2>/dev/null)fi model=$(echo "$input " | jq -r '.model.display_name // ""' ) remaining=$(echo "$input " | jq -r '.context_window.remaining_percentage // empty' ) parts="" parts=$(printf '\033[36m%s\033[0m' "$short_dir " )if [ -n "$git_branch " ]; then parts="$parts $(printf '\033[32m\033[0m \033[32m%s\033[0m' "$git_branch " ) " fi if [ -n "$model " ]; then parts="$parts $(printf '\033[33m%s\033[0m' "$model " ) " fi if [ -n "$remaining " ]; then remaining_int=$(printf '%.0f' "$remaining " ) if [ "$remaining_int " -le 20 ]; then parts="$parts $(printf '\033[31mctx:%s%%\033[0m' "$remaining_int " ) " else parts="$parts $(printf '\033[2mctx:%s%%\033[0m' "$remaining_int " ) " fi fi printf '%s' "$parts "
預設樣式
可以看到預設的 Script 已經幫你處理了幾件事情:
工作目錄 :會把家目錄縮短成 ~,用青色顯示
Git 分支 :自動偵測目前的分支,用綠色顯示
Model 名稱 :用黃色顯示
Context 剩餘量 :正常狀態下用灰色顯示,當剩餘量低於 20% 時會自動變成紅色警告
整體風格跟 Powerlevel10k(p10k)的終端機主題很像,如果你本來就有在用 p10k 的話,看起來會很一致。
Note 如果你還不知道什麼是 Powerlevel10k,可以先去看我之前寫的 Mac OS 終端機美化看這一篇就夠了! ,裡面有完整的安裝與設定流程。
這個預設 Script 對大部分人來說可以直接用,但如果你跟我一樣有在用 Powerlevel10k(p10k)的話,你應該會發現一個問題:工作目錄跟 Git 分支在 p10k 的 prompt 已經有了 ,Status Line 再顯示一次根本就是浪費空間嘛。
而且我覺得更關鍵的是,預設 Script 缺少了幾個我認為最重要的資訊:
Rate Limit 用量 :這才是最容易踩到雷的地方,5 小時的額度用完了你才知道就太晚了
三階段顏色警告 :預設只有「灰色」和「紅色」兩種狀態,缺少中間的黃色警告區間,等到變紅的時候往往已經來不及了
Session 花費 :對於使用 API Key 的開發者來說,即時知道這個 Session 花了多少錢很重要
所以接下來我會分享我自己客製化的版本,你可以直接拿去用,也可以根據自己的需求調整。
我的客製化版本 設計理念 在寫 Script 之前,我先想了一下到底什麼資訊是「只有 Status Line 能看到」的:
資訊
p10k 已有?
Status Line 該顯示?
工作目錄
有
不需要
Git 分支
有
不需要
Model 名稱
沒有
需要
Context 剩餘量
沒有
需要
Rate Limit
沒有
需要
Session 花費
沒有
需要
所以我的版本會先以這些資訊為主,目錄和 Git 分支的部分後面會再教大家怎麼加回來。
另外在顏色上,我用了三階段的設計:
綠色 (≥ 50%):安全,不用擔心
黃色 (21% ~ 49%):注意,該開始收尾或準備換 Session
紅色 (≤ 20%):危險,趕快處理手邊的事情
這個邏輯會同時套用在 Context 和 Rate Limit 上,讓你一眼就能判斷目前的狀態。
Script 內容 建立 ~/.claude/statusline.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 #!/bin/sh input=$(cat ) ICON_CTX=$(printf '\uf2db' ) ICON_CLOCK=$(printf '\uf017' ) ICON_COST=$(printf '\uf155' ) model=$(echo "$input " | jq -r '.model.display_name // ""' ) ctx_remain=$(echo "$input " | jq -r '.context_window.remaining_percentage // empty' ) five_h_used=$(echo "$input " | jq -r '.rate_limits.five_hour.used_percentage // empty' ) seven_d_used=$(echo "$input " | jq -r '.rate_limits.seven_day.used_percentage // empty' ) cost=$(echo "$input " | jq -r '.cost.total_cost_usd // empty' )color_by_remain () { local val=$1 if [ "$val " -le 20 ]; then printf '\033[31m' elif [ "$val " -le 49 ]; then printf '\033[33m' else printf '\033[32m' fi }mini_bar () { local percent=$1 local width=10 local filled=$((percent * width / 100 )) local empty=$((width - filled)) local i=0 while [ $i -lt $filled ]; do printf '━' ; i=$((i + 1 )); done while [ $i -lt $width ]; do printf '┄' ; i=$((i + 1 )); done } SEP=$(printf '\033[2m │ \033[0m' ) parts="" if [ -n "$model " ]; then parts=$(printf '\033[1;35m%s\033[0m' "$model " )fi if [ -n "$ctx_remain " ]; then val=$(printf '%.0f' "$ctx_remain " ) color=$(color_by_remain "$val " ) bar=$(mini_bar "$val " ) parts="$parts$SEP$(printf '%s%s %s %s%%\033[0m' "$color " "$ICON_CTX " "$bar " "$val " ) " fi if [ -n "$five_h_used " ]; then val=$((100 - $(printf '%.0 f' "$five_h_used "))) color=$(color_by_remain "$val " ) parts="$parts$SEP$(printf '%s%s 5h:%s%%\033[0m' "$color " "$ICON_CLOCK " "$val " ) " fi if [ -n "$seven_d_used " ]; then val=$((100 - $(printf '%.0 f' "$seven_d_used "))) color=$(color_by_remain "$val " ) parts="$parts$SEP$(printf '%s%s 7d:%s%%\033[0m' "$color " "$ICON_CLOCK " "$val " ) " fi if [ -n "$cost " ] && [ "$cost " != "0" ] && [ "$cost " != "null" ]; then parts="$parts$SEP$(printf '\033[2m%s $%s\033[0m' "$ICON_COST " "$cost " ) " fi printf '%s' "$parts "
我的版本
建立完之後,記得給它執行權限:
1 chmod +x ~/.claude/statusline.sh
Note 這個 Script 依賴 jq 來解析 JSON,如果你的系統還沒安裝的話,macOS 可以用 brew install jq,Linux 可以用 apt install jq 或 yum install jq 來安裝唷。
修改設定 接著打開 Claude Code 的設定檔 ~/.claude/settings.json,加入以下設定:
1 2 3 4 5 6 { "statusLine" : { "type" : "command" , "command" : "~/.claude/statusline.sh" } }
設定完重新啟動 Claude Code,你就會在終端機底部看到即時的狀態資訊囉~
顏色的部分會根據剩餘百分比自動變化,綠色代表安全、黃色代表該注意了、紅色代表快要爆掉。如果看到紅色的話,就趕快用 /compact 壓縮 Context,或是直接開新 Session 吧。
各段落說明 簡單整理一下每個區段的用途跟顏色邏輯:
區段
圖示
顏色
說明
Model 名稱
無
紫色粗體
固定顯示,跟其他資訊做視覺區隔
Context 進度條
\uf2db 晶片
綠/黃/紅
10 格進度條 + 百分比,最直覺的方式
5h Rate Limit
\uf017 時鐘
綠/黃/紅
5 小時滾動區間的剩餘額度
7d Rate Limit
\uf017 時鐘
綠/黃/紅
7 天滾動區間的剩餘額度
Session 花費
\uf155 美元
灰色
不搶眼但隨時可以瞄一下
Note Rate Limit 和 Session 花費的欄位,會根據你的登入方式有不同的資料。Pro/Max 訂閱用戶會有 Rate Limit 資料,API Key 用戶會有 Session 花費資料。Script 裡已經用 // empty 做了判斷,如果該欄位沒有資料就不會顯示,所以不用擔心會出現空白的區段。
不用 p10k?加回目錄和 Git 分支 如果你的終端機沒有用 p10k 或其他會顯示目錄資訊的主題,需要改兩個地方:
第一步:在 # ── 組合輸出 ── 的 parts="" 上方,加入目錄和 Git 分支的段落:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ICON_DIR=$(printf '\uf07b' ) ICON_GIT=$(printf '\ue725' ) cwd=$(echo "$input " | jq -r '.cwd // ""' ) short_dir=$(echo "$cwd " | sed "s|^$HOME |~|" ) parts=$(printf '\033[36m%s %s\033[0m' "$ICON_DIR " "$short_dir " ) git_branch="" if [ -d "$cwd /.git" ] || git -C "$cwd " rev-parse --git-dir > /dev/null 2>&1; then git_branch=$(git -C "$cwd " -c core.useBuiltinFSMonitor=false symbolic-ref --short HEAD 2>/dev/null)fi if [ -n "$git_branch " ]; then parts="$parts$SEP$(printf '\033[32m%s %s\033[0m' "$ICON_GIT " "$git_branch " ) " fi
Note 這邊用 printf '\uf07b' 來產生 Nerd Fonts 的圖示字元(資料夾和 Git 分支)。要注意的是,macOS 內建的 Bash 是 3.2 版,不支援 $'\uf07b' 這種寫法(需要 Bash 4.4 以上),但 printf '\uf07b' 在所有版本都能正常運作。如果你的終端機沒有安裝 Nerd Fonts 的話,可以把這兩行改成 ICON_DIR="📁" 和 ICON_GIT="🔀"。
第二步:刪掉 parts="",並把 Model 那段改成 append:
原本的寫法是這樣的:
1 2 3 4 5 6 7 parts="" if [ -n "$model " ]; then parts=$(printf '\033[1;35m%s\033[0m' "$model " )fi
要改成:
1 2 3 4 5 6 if [ -n "$model " ]; then parts="$parts$SEP$(printf '\033[1;35m%s\033[0m' "$model " ) " fi
這邊有兩個重點要注意:
刪掉 parts="" :因為前面目錄和 Git 分支已經把值存進 parts 了,如果這邊再重新清空,前面設定的內容就會全部消失
Model 改用 $parts$SEP :原本是直接賦值 parts=$(printf ...),這樣也會覆蓋掉前面的內容,要改成 append 的方式才能接在後面
完整版(含目錄和 Git 分支) 如果你不想自己拼拼湊湊,這邊直接提供改好的完整版,複製貼上就能用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 #!/bin/sh input=$(cat ) ICON_DIR=$(printf '\uf07b' ) ICON_GIT=$(printf '\ue725' ) ICON_CTX=$(printf '\uf2db' ) ICON_CLOCK=$(printf '\uf017' ) ICON_COST=$(printf '\uf155' ) model=$(echo "$input " | jq -r '.model.display_name // ""' ) ctx_remain=$(echo "$input " | jq -r '.context_window.remaining_percentage // empty' ) five_h_used=$(echo "$input " | jq -r '.rate_limits.five_hour.used_percentage // empty' ) seven_d_used=$(echo "$input " | jq -r '.rate_limits.seven_day.used_percentage // empty' ) cost=$(echo "$input " | jq -r '.cost.total_cost_usd // empty' )color_by_remain () { local val=$1 if [ "$val " -le 20 ]; then printf '\033[31m' elif [ "$val " -le 49 ]; then printf '\033[33m' else printf '\033[32m' fi }mini_bar () { local percent=$1 local width=10 local filled=$((percent * width / 100 )) local empty=$((width - filled)) local i=0 while [ $i -lt $filled ]; do printf '━' ; i=$((i + 1 )); done while [ $i -lt $width ]; do printf '┄' ; i=$((i + 1 )); done } SEP=$(printf '\033[2m │ \033[0m' ) cwd=$(echo "$input " | jq -r '.cwd // ""' ) short_dir=$(echo "$cwd " | sed "s|^$HOME |~|" ) parts=$(printf '\033[36m%s %s\033[0m' "$ICON_DIR " "$short_dir " ) git_branch="" if [ -d "$cwd /.git" ] || git -C "$cwd " rev-parse --git-dir > /dev/null 2>&1; then git_branch=$(git -C "$cwd " -c core.useBuiltinFSMonitor=false symbolic-ref --short HEAD 2>/dev/null)fi if [ -n "$git_branch " ]; then parts="$parts$SEP$(printf '\033[32m%s %s\033[0m' "$ICON_GIT " "$git_branch " ) " fi if [ -n "$model " ]; then parts="$parts$SEP$(printf '\033[1;35m%s\033[0m' "$model " ) " fi if [ -n "$ctx_remain " ]; then val=$(printf '%.0f' "$ctx_remain " ) color=$(color_by_remain "$val " ) bar=$(mini_bar "$val " ) parts="$parts$SEP$(printf '%s%s %s %s%%\033[0m' "$color " "$ICON_CTX " "$bar " "$val " ) " fi if [ -n "$five_h_used " ]; then val=$((100 - $(printf '%.0 f' "$five_h_used "))) color=$(color_by_remain "$val " ) parts="$parts$SEP$(printf '%s%s 5h:%s%%\033[0m' "$color " "$ICON_CLOCK " "$val " ) " fi if [ -n "$seven_d_used " ]; then val=$((100 - $(printf '%.0 f' "$seven_d_used "))) color=$(color_by_remain "$val " ) parts="$parts$SEP$(printf '%s%s 7d:%s%%\033[0m' "$color " "$ICON_CLOCK " "$val " ) " fi if [ -n "$cost " ] && [ "$cost " != "0" ] && [ "$cost " != "null" ]; then parts="$parts$SEP$(printf '\033[2m%s $%s\033[0m' "$ICON_COST " "$cost " ) " fi printf '%s' "$parts "
社群工具推薦 如果你不想自己寫 Script,社群也有一些現成的工具可以用:
ccstatusline :支援多種主題和 Powerline 風格,客製化程度很高
claude-statusline :提供預設好的設定,安裝完直接就能用
這些工具本質上也是幫你產生 Script,只是省去了自己寫的步驟。
為什麼建議設定 Status Line? 你可能會想說:知道 Context 剩多少有什麼用?反正爆了 Claude Code 也會自動壓縮啊。
但問題是,壓縮 Context 代表 Claude Code 會丟掉一部分之前的對話紀錄,這可能會導致它忘記你之前的指令或討論過的內容,然後你又要重新解釋一次,來來回回其實很浪費時間。
如果你能即時看到 Context 還剩多少,就可以在快要滿的時候主動用 /compact 來壓縮,或是開一個新的 Session 來避免資訊丟失。
Rate Limit 也是同樣的道理,如果你知道 5 小時的用量快到了,就可以先把重要的任務處理完,或是調整一下使用節奏,而不是等到被限制了才發現。
總結 Status Line 是一個很小但很實用的功能,設定完之後幾乎不會注意到它的存在,但當你需要的時候瞄一眼就知道目前的狀態,不用再靠感覺猜。
如果你跟我一樣每天都在用 Claude Code 開發的話,滿推薦花個幾分鐘把這個設定好的哩~