Claude statusline 自定义配置


什么是 Claude statusline

statusline 从字面意思理解就是【状态栏】,Claude 官方解释如下

状态行是 Claude Code 底部的可自定义栏,可以运行你配置的任何 shell 脚本。它通过 stdin 接收 JSON 会话数据,并显示你的脚本打印的任何内容,为你提供一个持久的、一目了然的上下文使用情况、成本、git 状态或任何其他你想跟踪的内容的视图。

有那些作用

  • 你想在工作时监控上下文窗口使用情况
  • 你需要跟踪会话成本
  • 你在多个会话中工作,需要区分它们
  • 你希望 git 分支和状态始终可见
  • 强迫症患者福音

有哪些样式

比如下面的多行状态栏

显示的信息都是基于当前会话

第一行:模型名称 | 工作路径 | git 分支/状态 (如果有)

第二行:上下文使用百分比 | 会话成本(美元) | 整个会话总共输入、输出token统计 | 花费总时间

如果百分比在你的环境下显示异常,可以自己替换成如 [####====]40% 这种简易的显示方式

如何实现

把以下内容保存在你磁盘上任意路径,推荐保存在 ~/.claude/statusline.sh

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')
INPUT_TOKENS=$(echo "$input" | jq -r '.context_window.total_input_tokens // 0')
OUTPUT_TOKENS=$(echo "$input" | jq -r '.context_window.total_output_tokens // 0')

format_tokens() {
    local tokens="${1:-0}"

    awk -v n="$tokens" 'BEGIN {
        if (n >= 1000000) {
            value = n / 1000000
            unit = "m"
        } else if (n >= 1000) {
            value = n / 1000
            unit = "k"
        } else {
            printf "%d", n
            exit
        }

        if (value >= 100) {
            printf "%.0f%s", value, unit
        } else if (value >= 10) {
            printf "%.1f%s", value, unit
        } else {
            printf "%.2f%s", value, unit
        }
    }'
}

INPUTKOEN="Σin:$(format_tokens "$INPUT_TOKENS")"
OUTKOEN="Σout:$(format_tokens "$OUTPUT_TOKENS")"

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

# Pick bar color based on context usage
if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))
printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"
BAR="${FILL// /█}${PAD// /░}"

TOTAL_SECS=$((DURATION_MS / 1000))
DAYS=$((TOTAL_SECS / 86400))
HOURS=$(((TOTAL_SECS % 86400) / 3600))
MINS=$(((TOTAL_SECS % 3600) / 60))
SECS=$((TOTAL_SECS % 60))

if [ "$TOTAL_SECS" -ge 86400 ]; then
    DURATION_FMT="${DAYS}d ${HOURS}h ${MINS}m ${SECS}s"
elif [ "$TOTAL_SECS" -ge 3600 ]; then
    TOTAL_HOURS=$((TOTAL_SECS / 3600))
    DURATION_FMT="${TOTAL_HOURS}h ${MINS}m ${SECS}s"
elif [ "$TOTAL_SECS" -ge 60 ]; then
    DURATION_FMT="${MINS}m ${SECS}s"
else
    DURATION_FMT="${SECS}s"
fi

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | ? $(git branch --show-current 2>/dev/null)"

echo -e "${CYAN}[$MODEL]${RESET} ? ${DIR##*/}$BRANCH"
COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ${INPUTKOEN} ${OUTKOEN} | ⏱️ ${DURATION_FMT}"

然后设置执行权限 chmod + x ~/.claude/statusline.sh ,最后在 Claude 的 ~/.claude/settings.json 配置如下内容

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

然后刷新会话或者重启 Claude 即可显示状态栏。

更多支持的字段和说明参考 Claude 官网说明部分: https://code.claude.com/docs/zh-CN/statusline


手机扫码阅读

深科特 LEAN MES系统 DownLoad.aspx 任意文件读取漏洞

深科特 LEAN MES系统 /Handler/FileSync.ashx 任意文件读取/上传/删除/SSRF等多个漏洞

评 论