我同時開了四個終端機分頁,每個都跑著一個 Claude Code。一個在改後端、一個在跑測試、一個在弄部署腳本、還有一個我已經忘記在幹嘛。切過去切過來,每次都要先問自己「這個是哪個專案來著」,然後等它吐一段話我才從內容認出來。

更糟的是 context。我在某一個分頁裡聊得正起勁,完全沒注意到 context window 已經快滿了,直到它開始忘記前面講過的事、開始鬼打牆,我才意識到「啊它已經塞爆了」。等我發現的時候,已經浪費了好幾輪對話。

這兩個問題的共通點是:我需要的資訊一直都在,只是我看不到。

我先試了笨方法

第一個念頭是手動。我在每個分頁開頭先 cd 到對的目錄、把專案名打在提示字元裡。撐了半天就放棄了——因為這些是靜態的,context 用到幾趴、這次 session 花了多少錢,這些會一直變的東西,手打根本跟不上。

第二個念頭是去翻 /cost 之類的指令,需要的時候手動敲一下查。問題是「需要的時候」永遠是「已經太遲的時候」。儀表這種東西的意義,就在於你不用主動去問它。你開車不會每隔幾分鐘輸入一個指令去查時速,時速就該一直在那。我要的不是一個查詢工具,是一條一直亮著的儀表板。

Claude Code 早就準備好這個東西了,它叫 statusline。

它的運作其實簡單到有點好笑

statusline 就是終端機最底下那條 bar,而它顯示什麼,完全由你給它的一支 shell script 決定。

機制是這樣:每當有狀態變動,Claude Code 就把這個 session 當下的所有資料,包成一包 JSON,從 stdin 餵給你的 script。你的 script 讀這包 JSON,挑出你想看的欄位,印出一行字。Claude Code 就把你印的那行字顯示在底部。就這樣。

換句話說,Claude Code 負責「把資料送過來」,「要怎麼呈現」整個交給你。這跟車子的儀表板剛好相反——車廠把儀表釘死了你不能改,而這裡引擎蓋一掀,連儀表要長什麼樣都是你說了算。

那包 JSON 裡有什麼?大致長這樣:

1
2
3
4
5
6
7
{
"model": { "display_name": "Opus" },
"workspace": { "current_dir": "/Users/you/project" },
"context_window": { "used_percentage": 8, "context_window_size": 200000 },
"cost": { "total_cost_usd": 0.01234, "total_lines_added": 156 },
"version": "2.1.90"
}

還有更多——git 分支、PR 狀態、rate limit 用了幾趴、目前的 reasoning effort、vim 模式,全都在裡面。你想顯示什麼,就從這包挑什麼。

最快的做法:張嘴叫它自己寫

如果你連 script 都懶得碰,有個捷徑。直接在 Claude Code 裡打 /statusline,後面用白話描述你要什麼:

1
/statusline 顯示模型名稱、context 用量百分比,加一個進度條

它會幫你把 script 寫好、丟到 ~/.claude/、連 settings 都自動改好。對大部分人來說,這一步就夠用了。

但如果你想懂它到底在幹嘛——而且我建議你懂,因為懂了你才改得動它——我們手動走一遍。

手動做一條:三步驟

第一步,寫一支讀 JSON、印一行字的 script。存成 ~/.claude/statusline.sh

1
2
3
4
5
6
7
8
#!/bin/bash
input=$(cat) # 把 stdin 整包讀進來
MODEL=$(echo "$input" | jq -r '.model.display_name') # 挑出模型名
DIR=$(echo "$input" | jq -r '.workspace.current_dir') # 挑出當前目錄
# "// 0" 是在欄位是 null 時給一個保底值,避免印出空白
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context" # ${DIR##*/} 只留資料夾名

這裡用到 jq,一個命令列的 JSON 解析器,沒裝的話要先裝。如果你習慣 Python 或 Node,它們內建就會解 JSON,不用額外裝東西。

第二步,給它執行權限:

1
chmod +x ~/.claude/statusline.sh

第三步,告訴 Claude Code 用這支 script。打開 ~/.claude/settings.json,加一段:

1
2
3
4
5
6
7
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh",
"padding": 2
}
}

type 設成 "command" 意思是「跑這個 shell 指令」,padding 是左邊多留幾格空白,純粹是視覺微調。存檔,下一次跟 Claude Code 互動時,底部那條就出現了。

把那個讓我踩坑的 context 條做出來

回到我一開始的痛點——沒注意到 context 快爆。光看一個百分比數字其實還是不夠醒目,數字要變成「一眼就感覺到」的東西,才真的有用。所以把它做成進度條:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
input=$(cat)
MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

BAR_WIDTH=10
FILLED=$((PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))
BAR=""
[ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /▓}"
[ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /░}"

echo "[$MODEL] $BAR $PCT%"

現在底部會出現 [Opus] ▓▓▓░░░░░░░ 30% 這種東西。塞到一半,那條黑塊長到一半,你餘光就會瞄到,根本不用主動讀數字。這就是把「需要主動查的資訊」變成「被動就會注意到的訊號」——儀表板的全部意義都在這個轉換上。

想再進階一點,可以加顏色。終端機認 ANSI escape code,\033[32m 是綠、\033[33m 是黃、\033[0m 是重置。git 有改動就標黃、context 過半就轉紅,這些都是幾行 if 的事。多行也行——每個 echo 印一行,第一行放 git、第二行放 context 條,就成了一個兩層的迷你面板。

兩個你該知道的細節

第一,它不花錢也不花 token。statusline 是純本地跑你的 script,不會去呼叫 API。所以你大可在裡面塞 git 查詢、塞各種計算,不用擔心它偷吃你的額度。

第二,它什麼時候更新。你的 script 會在這幾個時機跑:每次 Claude 回完一則訊息、/compact 結束後、權限模式切換、vim 模式切換。更新有 300ms 的 debounce,連續變動會併成一次。但要注意——如果主 session 閒著(比方說在等背景 subagent),這些觸發點會安靜下來。所以如果你顯示的是時鐘這種「跟對話無關、自己會變」的東西,記得在設定裡加一個 refreshInterval(單位秒,最小 1),讓它額外照固定間隔重跑。

繞回最開始的四個分頁

現在我那四個分頁,每個底部都亮著一條:模型、專案資料夾名、一條 context 進度條、這次 session 花了多少。切過去的瞬間我就知道「這個是後端專案、context 才三成、還很安全」,不用再等它吐話來認。那個會讓我鬼打牆的 context 爆掉,現在還沒滿我就看到黑塊在長,提早 /compact 掉。

值得記住的不是某一支 script 怎麼寫,而是 statusline 給了你一個位置——終端機底部那條一直在你眼前、卻不打斷你的地方。哪些資訊值得放在那裡,沒有標準答案,那是你自己工作型態的問題。先想清楚「我最常在哪件事上後知後覺」,再回頭決定那條要顯示什麼。工具給你的是一塊空白的儀表板,填什麼,是你比工具更懂的事。

原文來源:Customize your status line — Claude Code Docs