
Claude Codeを使っていると、ふとした瞬間に気になることがあります。
「今、レート制限どのくらい残ってるんだっけ。」
「このまま話し続けてコンテキストウィンドウが詰まったら困るな。」
「エフォートレベル、highのままだっけ。」
これ、いちいち確認しにいくのが地味にストレスでした。

Zennで同じような設定をしている記事を見かけて、自分も試してみることにしました。結論、思っていたより簡単で、作業体験がかなり改善しました。
できあがったもの
ターミナル下部のステータスラインに、こんな表示が常時出るようになりました。
Opus 4.7 (high) | 5h ████░░░░░░ 10% | 7d █░░░░░░░░░ 6% | ctx ███░░░░░░░ 33% | my-project

表示している情報は5つです。
- モデル名+エフォートレベル — 今どのモデルで、どの思考レベルで動いているか
- 5時間のトークン使用率 — レート制限の短期的な残量
- 7日間のトークン使用率 — 週単位の残量。リセット前後に見ると分かりやすい
- コンテキスト使用率 — 現在の会話がどのくらい詰まっているか
- カレントディレクトリ名 — 今どのプロジェクトで作業しているか
使用率に応じてバーの色が変わります。
- 緑(0〜30%): 余裕あり
- 黄(30〜70%): 中盤
- 赤(70%以上): 警戒

コンテキストが赤くなったら /clear(完全リセット)か /compact(会話を要約して圧縮)を検討するサイン。/clear は会話履歴をすべて消してまっさらな状態に戻す。/compact は履歴を要約した上で会話を続けるので、作業の流れを保ちつつコンテキストを節約したいときに使えます。状況に応じて使い分けています。
必要な環境
注意: この設定はClaude.aiのサブスクリプション(ProまたはMaxプラン)ユーザー向けです。
レート制限のデータ(rate_limits)はClaude.ai経由のセッションでのみ取得できます。APIキーで直接利用している場合、5h・7dのバーは表示されません(他の情報は表示されます)。
jq(JSONパーサー)awk
macOSにはデフォルトで awk が入っています。jq は Homebrew で入れられます。
brew install jq
設定方法
0. 実は自分で書かなくてもいい

実はこの設定、自分でゼロから書いたわけではありません。
Claude Code本人に「ステータスラインにレート制限とコンテキスト使用率を表示したい。色で残量がわかるようにしてほしい」と伝えたら、スクリプトの作成から settings.json への設定追記まで全部やってくれました。
自分でシェルスクリプトを書く必要はなくて、「こういうふうに表示したい」とイメージを伝えるだけで実装してくれます。この記事は「何を設定しているか」の解説として読んでもらえれば十分で、実際にやってみるときはClaude Codeに相談するのが一番早いです。
1. シェルスクリプトを配置する
~/.claude/statusline-command.sh を作成します。以下がスクリプト全体です。
#!/bin/sh
# 使用率に応じたANSIカラーコードを返す関数
color_for_pct() {
pct=$1
if [ "$(echo "$pct" | awk '{print ($1 < 30)}')" = "1" ]; then
printf '\033[32m' # 緑: 0〜30%
elif [ "$(echo "$pct" | awk '{print ($1 < 70)}')" = "1" ]; then
printf '\033[33m' # 黄: 30〜70%
else
printf '\033[31m' # 赤: 70%〜
fi
}
# プログレスバーを生成する関数(10マスで表現)
make_bar() {
pct=$1
filled=$(echo "$pct" | awk '{printf "%d", $1 / 10}')
empty=$((10 - filled))
bar=""
i=0
while [ $i -lt $filled ]; do
bar="${bar}█"
i=$((i + 1))
done
i=0
while [ $i -lt $empty ]; do
bar="${bar}░"
i=$((i + 1))
done
echo "$bar"
}
input=$(cat)
# モデル名
model=$(echo "$input" | jq -r '.model.display_name // .model.id // "Unknown"')
# エフォートレベル: ~/.claude/settings.json の effortLevel フィールドから読み取る
effort=$(jq -r '.effortLevel // empty' ~/.claude/settings.json 2>/dev/null)
# モデル名にエフォートを付加(取得できた場合のみ)
if [ -n "$effort" ]; then
model_display="${model} (${effort})"
else
model_display="${model}"
fi
# 5時間レート制限
five_pct=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
# 7日レート制限
week_pct=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')
# コンテキスト使用率
ctx_pct=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
# カレントディレクトリ名
folder=$(echo "$input" | jq -r '.workspace.current_dir // .cwd // ""' | xargs basename 2>/dev/null)
# 出力を組み立て
output="$model_display"
RESET='\033[0m'
if [ -n "$five_pct" ]; then
five_int=$(printf "%.0f" "$five_pct")
five_bar=$(make_bar "$five_int")
five_color=$(color_for_pct "$five_int")
output="${output} | 5h ${five_color}${five_bar} ${five_int}%${RESET}"
fi
if [ -n "$week_pct" ]; then
week_int=$(printf "%.0f" "$week_pct")
week_bar=$(make_bar "$week_int")
week_color=$(color_for_pct "$week_int")
output="${output} | 7d ${week_color}${week_bar} ${week_int}%${RESET}"
fi
if [ -n "$ctx_pct" ]; then
ctx_int=$(printf "%.0f" "$ctx_pct")
ctx_bar=$(make_bar "$ctx_int")
ctx_color=$(color_for_pct "$ctx_int")
output="${output} | ctx ${ctx_color}${ctx_bar} ${ctx_int}%${RESET}"
fi
if [ -n "$folder" ]; then
output="${output} | $folder"
fi
printf "%b" "$output"
スクリプトを保存したら実行権限を付与します。
chmod +x ~/.claude/statusline-command.sh
2. settings.json に設定を追記する
~/.claude/settings.json を開いて、以下を追加します。
{
"statusLine": {
"type": "command",
"command": "bash /Users/あなたのユーザー名/.claude/statusline-command.sh"
}
}
type: "command" と command の2フィールドが必要です。パスはフルパスで書く必要があります。~/ の展開がうまくいかないことがあるため、ユーザー名を直接書いておくのが確実です。
設定後、Claude Codeを再起動すると反映されます。
注意: セッション開始直後はレート制限が表示されないことがあります。
rate_limitsのデータは最初のAPIレスポンスが返って初めて取得できる仕様です。セッション開始後1〜2ターンは5h・7dのバーが表示されず、空欄になることがあります。「動いていないのかな?」と思ったらまずひと言話しかけてみてください。
ハマったポイント

エフォートレベルはJSONに含まれない
ステータスラインのスクリプトには、Claude CodeがJSON形式でコンテキスト情報を渡してきます。最初、エフォートレベルもこのJSONに含まれていると思っていたのですが、実際には入っていませんでした。
公式ドキュメントにも記載がなく、少し調べた結果、~/.claude/settings.json の effortLevel フィールドを直接読みに行くことで取得できました。
effort=$(jq -r '.effortLevel // empty' ~/.claude/settings.json 2>/dev/null)
スクリプトに渡ってくるJSONで取得できる主なフィールドは以下の通りです。
| フィールド | 内容 |
|---|---|
model.display_name |
モデルの表示名 |
model.id |
モデルID(display_nameがない場合のフォールバック) |
rate_limits.five_hour.used_percentage |
5時間レート制限の使用率(%) |
rate_limits.seven_day.used_percentage |
7日間レート制限の使用率(%) |
context_window.used_percentage |
コンテキストウィンドウの使用率(%) |
workspace.current_dir |
現在の作業ディレクトリのフルパス |
printf "%b" を使う理由
スクリプト末尾の出力部分で printf "%b" を使っています。
%s を使うと、ANSIエスケープシーケンス(\033[32m など)が文字列リテラルのまま出力されてしまい、色が付かずコードがそのまま表示されてしまいます。%b はバックスラッシュエスケープを解釈するので、ターミナルが色として認識してくれます。echo -e でも同じ結果になりますが、shの移植性を考えると printf "%b" の方が安全です。
トラブルシュート

表示がうまくいかないときのチェックリストです。
- 何も表示されない → スクリプトに実行権限が付いているか確認(
chmod +x ~/.claude/statusline-command.sh) - settings.json が読まれていない →
commandのパスがフルパスになっているか確認(~/ではなく/Users/ユーザー名/...と書く) - 設定を変えたのに反映されない → Claude Codeを完全に再起動する
- 色が出ない・文字化けする → ターミナルが256色・ANSIカラーに対応しているか確認(iTerm2やWezTermなら問題ないはず)
- 5h・7dだけ表示されない → セッション開始直後の可能性あり。1〜2ターン会話してから確認する
使ってみた感想

一番変わったのは「コンテキストの管理意識」です。
以前は会話が詰まっているかどうか意識しないまま作業を続けて、気づいたら応答が鈍くなっていた、ということが何度かありました。常時表示されることで、「ctx が60%超えてきたな、そろそろ区切りのいいところで /clear しよう」という判断が自然にできるようになりました。
レート制限の残量も同様で、「5h の使用率が高いから、ここは Sonnet に切り替えておこう」という判断がすぐできます。
カスタマイズのヒント
このスクリプトはそのままでも使えますが、いじれる箇所はたくさんあります。
- 色の閾値を変える — 30%・70%の境界を自分のペース感に合わせて調整できます
- バー文字を変える —
█░の代わりに▰▱や●○など好みの記号にできます - 表示する情報を追加する — gitブランチ名・現在時刻・バッテリー残量なども同じ仕組みで追加できます
「この部分こう変えたい」とClaude Codeに伝えれば、スクリプトの修正から反映まで一緒にやってくれます。

コメント