是 Ray 不是 Array

整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ

Advertisement
AI

Claude Code Status Line 設定教學:在終端機即時監控 Context 用量與 Rate Limit

Claude Code Status Line 設定教學:在終端機即時監控 Context 用量與 Rate Limit
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
# Claude Code status line script
# Mirrors the p10k prompt style: dir | git | model | context

input=$(cat)

# Directory: shorten home to ~
cwd=$(echo "$input" | jq -r '.workspace.current_dir // .cwd // ""')
short_dir=$(echo "$cwd" | sed "s|^$HOME|~|")

# Git branch (skip optional locks)
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 short name
model=$(echo "$input" | jq -r '.model.display_name // ""')

# Context remaining
remaining=$(echo "$input" | jq -r '.context_window.remaining_percentage // empty')

# Build output
parts=""

# Directory segment (cyan)
parts=$(printf '\033[36m%s\033[0m' "$short_dir")

# Git branch segment (green)
if [ -n "$git_branch" ]; then
parts="$parts $(printf '\033[32m\033[0m \033[32m%s\033[0m' "$git_branch")"
fi

# Model segment (yellow)
if [ -n "$model" ]; then
parts="$parts $(printf '\033[33m%s\033[0m' "$model")"
fi

# Context remaining (dimmed, only when available)
if [ -n "$remaining" ]; then
remaining_int=$(printf '%.0f' "$remaining")
if [ "$remaining_int" -le 20 ]; then
# Warning: red when low
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)

# ── Nerd Fonts 圖示 ──
# 如果你的終端機沒有安裝 Nerd Fonts,可以把這些改成一般文字
# 例如 ICON_CTX="ctx"、ICON_CLOCK="⏰"、ICON_COST="$"
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')

# ── 顏色函式:依剩餘百分比決定顏色 ──
# 綠色 ≥50% │ 黃色 21-49% │ 紅色 ≤20%
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
}

# ── 進度條:10 格寬度 ──
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=""

# Model(紫色粗體,讓它跟其他資訊有區隔)
if [ -n "$model" ]; then
parts=$(printf '\033[1;35m%s\033[0m' "$model")
fi

# Context 剩餘(進度條 + 百分比)
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

# 5 小時 Rate Limit
if [ -n "$five_h_used" ]; then
val=$((100 - $(printf '%.0f' "$five_h_used")))
color=$(color_by_remain "$val")
parts="$parts$SEP$(printf '%s%s 5h:%s%%\033[0m' "$color" "$ICON_CLOCK" "$val")"
fi

# 7 天 Rate Limit
if [ -n "$seven_d_used" ]; then
val=$((100 - $(printf '%.0f' "$seven_d_used")))
color=$(color_by_remain "$val")
parts="$parts$SEP$(printf '%s%s 7d:%s%%\033[0m' "$color" "$ICON_CLOCK" "$val")"
fi

# Session 花費(灰色,不搶眼但需要時看得到)
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 jqyum 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
# Nerd Fonts 圖示(沒裝 Nerd Fonts 可改成 📁 和 🔀)
ICON_DIR=$(printf '\uf07b')
ICON_GIT=$(printf '\ue725')

# 工作目錄(青色,前面加上資料夾 icon)
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 分支(綠色,前面加上分支 icon)
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=""

# Model(紫色粗體,讓它跟其他資訊有區隔)
if [ -n "$model" ]; then
parts=$(printf '\033[1;35m%s\033[0m' "$model")
fi

要改成:

1
2
3
4
5
6
# ── 組合輸出 ──

# Model(紫色粗體,讓它跟其他資訊有區隔)
if [ -n "$model" ]; then
parts="$parts$SEP$(printf '\033[1;35m%s\033[0m' "$model")"
fi

這邊有兩個重點要注意:

  1. 刪掉 parts="":因為前面目錄和 Git 分支已經把值存進 parts 了,如果這邊再重新清空,前面設定的內容就會全部消失
  2. 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)

# ── Nerd Fonts 圖示 ──
# 沒裝 Nerd Fonts 的話,可以把圖示改成一般文字或 emoji
# 例如 ICON_DIR="📁"、ICON_GIT="🔀"、ICON_CTX="ctx"、ICON_CLOCK="⏰"、ICON_COST="$"
ICON_DIR=$(printf '\uf07b') # 資料夾圖示
ICON_GIT=$(printf '\ue725') # Git 分支圖示
ICON_CTX=$(printf '\uf2db') # 晶片圖示(Context)
ICON_CLOCK=$(printf '\uf017') # 時鐘圖示(Rate Limit)
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')

# ── 顏色函式:依剩餘百分比決定顏色 ──
# 綠色 ≥50% │ 黃色 21-49% │ 紅色 ≤20%
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
}

# ── 進度條:10 格寬度 ──
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 分支(綠色)──
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

# ── Model(紫色粗體)──
if [ -n "$model" ]; then
parts="$parts$SEP$(printf '\033[1;35m%s\033[0m' "$model")"
fi

# ── Context 剩餘(進度條 + 百分比)──
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

# ── 5 小時 Rate Limit ──
if [ -n "$five_h_used" ]; then
val=$((100 - $(printf '%.0f' "$five_h_used")))
color=$(color_by_remain "$val")
parts="$parts$SEP$(printf '%s%s 5h:%s%%\033[0m' "$color" "$ICON_CLOCK" "$val")"
fi

# ── 7 天 Rate Limit ──
if [ -n "$seven_d_used" ]; then
val=$((100 - $(printf '%.0f' "$seven_d_used")))
color=$(color_by_remain "$val")
parts="$parts$SEP$(printf '%s%s 7d:%s%%\033[0m' "$color" "$ICON_CLOCK" "$val")"
fi

# ── Session 花費(灰色)──
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 開發的話,滿推薦花個幾分鐘把這個設定好的哩~

你的支持會直接轉換成更多技術筆記

如果我的筆記讓你少踩一個坑、節省 Debug 的時間,
也許你可以請我喝杯咖啡,讓我繼續當個不是 Array 的 Ray ☕

buymeacoffee | line | portaly
Terminal

整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ

Advertisement

分享這篇文章

留言

© 2026 Ray. All rights reserved.

Powered by Ray Theme