0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ClaudeCodeのstatusLineを作ってみる

0
Last updated at Posted at 2026-06-11

Claude Code を使っていると、

  • 今どのモデルで動いているか
  • コンテキスト残量
  • /compact を実行するタイミング

を確認したくなることがあります。
毎回 /context を実行すれば確認できますが、開発中に何度も確認するのは少し面倒です。
そこで Claude Code の statusLine を使って、画面下部に 現在のモデル名コンテキスト使用率 を常時表示するようにしました。

完成イメージ

スクリーンショット (69).png

表示例

◆ Opus 4.6 │ ██░░░░░░ 42K/200K (21%)

コンテキスト使用率が 80% を超えると警告アイコンも表示します。

◆ Opus 4.6 │ ██████░░ 165K/200K (83%) ⚠

すぐ使いたい人向け

以下を ~/.local/bin/statusline.sh として保存してください。

statusline.sh
#!/usr/bin/env bash

set -uo pipefail

# --- stdin の JSON を読み込む(これが本体)-----------------------------------
input="$(cat)"

# --- jq の存在確認 -----------------------------------------------------------
if ! command -v jq >/dev/null 2>&1; then
    echo "◆ statusline: jq が見つかりません (brew install jq / apt install jq)"
    exit 0
fi

jq_get() {
    # $1: jq フィルタ, $2: フォールバック値
    local val
    val="$(printf '%s' "$input" | jq -r "$1" 2>/dev/null)"
    if [[ -z "$val" || "$val" == "null" ]]; then
        printf '%s' "$2"
    else
        printf '%s' "$val"
    fi
}

# --- フィールド抽出 -----------------------------------------------------------
# モデル名は display_name が既に整形済み(例: "Opus 4.6")なのでそのまま使う
model="$(jq_get '.model.display_name' "$(jq_get '.model.id' 'unknown')")"

# コンテキスト使用率(真実の値。/context と一致する)
used_pct_raw="$(jq_get '.context_window.used_percentage' '0')"
ctx_size="$(jq_get '.context_window.context_window_size' '200000')"

# --- 数値の正規化 -------------------------------------------------------------
# used_percentage は小数のことがある(例: 12.4)ので整数に丸める
pct="$(awk -v p="$used_pct_raw" 'BEGIN { printf "%d", (p < 0 ? 0 : (p > 100 ? 100 : p)) + 0.5 }')"

# 表示用トークン数は used_percentage × context_window_size から導出する。
# (context_window.total_input_tokens 等はセッション累計でズレるため使わない)
tokens="$(awk -v p="$used_pct_raw" -v s="$ctx_size" 'BEGIN { printf "%d", (p/100)*s }')"

# --- 数値を K / M 表記に整形 --------------------------------------------------
human() {
    local n="$1"
    if   (( n >= 1000000 )); then awk -v n="$n" 'BEGIN { printf "%.1fM", n/1000000 }'
    elif (( n >= 1000    )); then echo "$(( n / 1000 ))K"
    else                          echo "$n"
    fi
}

token_display="$(human "$tokens")"
max_display="$(human "$ctx_size")"

# --- プログレスバー -----------------------------------------------------------
bar_width=8
filled=$(( pct * bar_width / 100 ))
(( filled > bar_width )) && filled=$bar_width
empty=$(( bar_width - filled ))

bar=""
for (( i=0; i<filled; i++ )); do bar+="█"; done
for (( i=0; i<empty;  i++ )); do bar+="░"; done

# --- 警告表示 -----------------------------------------------------------------
warn=""
(( pct >= 80 )) && warn=" ⚠"

# --- 出力 ---------------------------------------------------------------------
echo "◆ ${model}${bar} ${token_display}/${max_display} (${pct}%)${warn}"

実行権限を付与します。

chmod +x ~/.local/bin/statusline.sh

~/.claude/settings.json に以下を設定します。

{
  "statusLine": {
    "type": "command",
    "command": "~/.local/bin/statusline.sh"
  }
}

これで Claude Code 起動時に statusLine が表示されます。

ここから先は、「なぜこうなっているのか」を解説します。

Claude Code の statusLine とは

Claude Code の statusLine は、画面下部に任意の情報を表示できる仕組みです。

公式ドキュメントはこちらです。

~/.claude/settings.jsonstatusLine.command を設定すると、Claude Code がそのコマンドを実行し、標準出力に出した文字列をステータスラインとして表示してくれます。

Claude Code の statusLine は stdin で情報を渡してくる

Claude Code は statusLine 用のコマンドを実行する際、現在のセッション情報を stdin の JSON として渡してきます。
つまり流れは次のようになります。

Claude Code
  ↓ JSON を stdin に渡す
statusline.sh
  ↓ 文字列を stdout に出す
Claude Code の画面下部に表示

その JSON の中に、モデル名やコンテキスト使用率などの情報が含まれています。

{
  "context_window": {
    "used_percentage": 21.4,
    "context_window_size": 200000
  }
}

そのため statusLine のスクリプトでは、まず stdin を読む必要があります。

input="$(cat)"

これを忘れると、モデル名やコンテキスト使用率を取得できません。

ポイント

Claude Code が stdin に渡してくれる JSON には、context_window.used_percentage という値があります。
これはコンテキストウィンドウの使用率です。
今回のスクリプトでは、この値を「コンテキスト使用率の基準」として扱います。

{
  "context_window": {
    "used_percentage": 21.4,
    "context_window_size": 200000
  }
}

表示しているトークン数は厳密なトークン会計ではなく、次の値から算出した推定値です。

used tokens ≒ used_percentage × context_window_size
used_pct_raw="$(jq_get '.context_window.used_percentage' '0')"
ctx_size="$(jq_get '.context_window.context_window_size' '200000')"

tokens="$(awk -v p="$used_pct_raw" -v s="$ctx_size" 'BEGIN { printf "%d", (p/100)*s }')"

正確なトークン数を表示したいというより、

そろそろコンテキストが詰まってきたな

を素早く把握することを目的にしています。
そのため、used_percentage を基準にするのがシンプルで分かりやすいと考えました。

実行権限を付ける

chmod +x ~/.local/bin/statusline.sh

jq が入っていない場合はインストールします。
macOS なら Homebrew で入れられます。

brew install jq

Ubuntu / Debian 系なら次のように入れます。

sudo apt install jq

Claude Code の settings.json に設定する

~/.claude/settings.jsonstatusLine を追加します。

{
  "statusLine": {
    "type": "command",
    "command": "~/.local/bin/statusline.sh"
  }
}

これで Claude Code を起動すると、画面下部に statusLine が表示されます。

モック JSON で動作確認する

Claude Code 上で試す前に、ターミナルから直接確認できます。

echo '{"model":{"display_name":"Opus 4.6"},"context_window":{"used_percentage":25,"context_window_size":200000}}' \
  | ~/.local/bin/statusline.sh

出力例です。

◆ Opus 4.6 │ ██░░░░░░ 50K/200K (25%)

80% を超えた場合も確認できます。

echo '{"model":{"display_name":"Opus 4.6"},"context_window":{"used_percentage":83,"context_window_size":200000}}' \
  | ~/.local/bin/statusline.sh

出力例です。

◆ Opus 4.6 │ ██████░░ 166K/200K (83%) ⚠

注意点

jq が必要

このスクリプトは JSON のパースに jq を使っています。
jq がない場合は、statusLine 上に次のようなメッセージを出して終了します。

◆ statusline: jq が見つかりません (brew install jq / apt install jq)

Claude Code 側を壊さないように、エラー終了ではなく exit 0 にしています。

古い Claude Code ではフィールドがない可能性がある

context_window.used_percentage などのフィールドは、Claude Code のバージョンによって利用できる内容が変わる可能性があります。
うまく表示されない場合は、Claude Code をアップデートしてから確認するとよさそうです。

claude update

また、初回応答前など、タイミングによって値が null になる可能性もあるため、スクリプト側ではフォールバック値を用意しています。

jq_get '.context_window.used_percentage' '0'

statusLine のスクリプトは軽くする

statusLine のコマンドは繰り返し実行されます。
そのため、重い処理やネットワークアクセスを入れると体感が悪くなる可能性があります。
今回のスクリプトは、stdin の JSON を読んで jqawk で整形するだけにしています。

さらに発展させるなら

statusLine には他にも色々な情報を表示できます。
例えば次のような項目を追加しても面白そうです。

  • Git ブランチ
  • カレントディレクトリ
  • セッションコスト
  • Rate Limit
  • Vim モード
  • 使用中モデルの切り替え状況

ただし statusLine は常時表示されるため、情報を詰め込みすぎると逆に見づらくなります。
個人的には、まずはコンテキスト使用率だけ表示する構成がおすすめです。

まとめ

Claude Code の statusLine を使うと、作業中に見たい情報を画面下部に常時表示できます。
今回のスクリプトでは、次のような表示を作りました。

◆ Opus 4.6 │ ██░░░░░░ 42K/200K (21%)

ポイントは次の3つです。

  • Claude Code は statusLine コマンドに JSON を stdin で渡す
  • コンテキスト使用率は context_window.used_percentage を使う
  • statusLine は常に表示されるので、短く軽くする

毎回 /context を打つのが面倒な人には、かなり便利です。

自分の場合は、コンテキストが 80% を超えたら「そろそろ整理するか」という目安にしています。
是非、自分専用のstatuslineを育成してみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?