高级配置¶
本文你会学到:
- 📊 自定义状态栏(StatusLine)的配置、完整数据字段与实用脚本示例
- 🕐 Checkpointing 检查点:自动跟踪编辑、回溯恢复与限制
- 🔑 常用环境变量速查
- 🌐 企业网络代理、自定义 CA 证书与 mTLS 配置
- 🎙️ 语音输入的启用与按键绑定
📊 怎么自定义状态栏?¶
什么是状态栏?¶
状态栏是 Claude Code 底部的一个自定义信息条。它运行你配置的 shell 脚本,实时显示会话状态——上下文用量、费用、Git 分支等。
快速设置¶
刚用上 Claude Code,想在状态栏里一眼看到当前模型和上下文用量,但完全不想手写脚本?或者团队里每个人都想要不同的状态栏信息,不想让每个人去写 Bash?
Claude Code 提供了自然语言配置方式,用一句话描述你想要的效果即可:
Claude Code 会自动生成脚本并配置好 settings.json。
手动配置¶
| settings.json | |
|---|---|
也可以使用内联命令(用 jq 解析 JSON):
| 内联命令示例 | |
|---|---|
可用的数据字段¶
Claude Code 通过 stdin 向你的脚本发送 JSON 数据。下表列出全部字段,⭐ 标记为常用核心字段:
| 字段 | 说明 |
|---|---|
⭐ model.id, model.display_name |
当前模型标识符和显示名称 |
⭐ context_window.used_percentage |
上下文窗口已用百分比 |
⭐ context_window.remaining_percentage |
上下文窗口剩余百分比 |
⭐ cost.total_cost_usd |
本次会话总费用(USD) |
⭐ cost.total_duration_ms |
会话总时长(毫秒) |
⭐ cost.total_lines_added, cost.total_lines_removed |
新增/删除代码行数 |
⭐ session_id |
会话唯一标识 |
⭐ version |
Claude Code 版本号 |
cwd, workspace.current_dir |
当前工作目录(两个字段值相同,推荐用 workspace.current_dir) |
workspace.project_dir |
启动 Claude Code 的原始目录,会话期间工作目录变更时可能与 cwd 不同 |
workspace.added_dirs |
通过 /add-dir 或 --add-dir 添加的额外目录,未添加时为空数组 |
workspace.git_worktree |
当前目录在 git worktree add 创建的链接 worktree 内时的名称(v2.1.97 新增) |
cost.total_api_duration_ms |
等待 API 响应的总时间(毫秒) |
context_window.total_input_tokens, context_window.total_output_tokens |
整个会话中的累积令牌计数 |
context_window.context_window_size |
最大上下文窗口大小(令牌),默认 200000,扩展上下文模型为 1000000 |
context_window.current_usage |
来自最近一次 API 调用的令牌计数(详见下方) |
exceeds_200k_tokens |
最近一次 API 响应的总令牌数是否超过 200k(固定阈值,与实际上下文窗口大小无关) |
effort.level |
当前推理工作量(low/medium/high/xhigh/max),不支持该参数的模型不存在此字段 |
thinking.enabled |
是否启用了扩展思考 |
rate_limits.five_hour.used_percentage, rate_limits.seven_day.used_percentage |
5 小时/7 天速率限制已消耗百分比(0-100),仅 Claude.ai 订阅者第一次 API 响应后出现 |
rate_limits.five_hour.resets_at, rate_limits.seven_day.resets_at |
速率限制窗口重置的 Unix 纪元秒 |
session_name |
通过 --name 或 /rename 设置的自定义会话名称,未设置时不存在 |
transcript_path |
对话记录文件路径 |
output_style.name |
当前输出样式名称 |
vim.mode |
Vim 模式(NORMAL/INSERT/VISUAL/VISUAL LINE),仅启用 Vim 模式时存在 |
agent.name |
使用 --agent 标志或代理配置运行时的代理名称 |
worktree.name, worktree.path, worktree.branch |
--worktree 会话的 worktree 信息(名称、路径、分支) |
worktree.original_cwd, worktree.original_branch |
进入 worktree 前的目录和分支 |
状态栏在以下场景特别有用:监控上下文窗口用量、跟踪会话成本、在多个会话间做区分、让 Git 分支和状态始终可见。
状态栏的工作原理¶
Claude Code 通过 stdin 向你的脚本发送 JSON 会话数据,你的脚本读取 JSON、提取需要的字段,然后将文本打印到 stdout。Claude Code 会显示脚本输出的任何内容。
更新时机:脚本在每条新的助手消息之后、权限模式更改时或 Vim 模式切换时运行。更新在 300ms 处防抖,快速更改会批处理在一起。如果脚本仍在运行时触发新更新,正在执行的会被取消。
输出能力:
- 多行:每个
echo或print语句显示为单独的行 - 颜色:使用 ANSI 转义码(如
\033[32m表示绿色),需要终端支持 - 链接:使用 OSC 8 转义序列让文本可点击(macOS 上 Cmd+click,Windows/Linux 上 Ctrl+click),需要 iTerm2、Kitty、WezTerm 等支持超链接的终端
本地运行,不消耗 API Token
状态栏脚本在本地运行,不消耗 API 令牌。在自动完成建议、帮助菜单和权限提示等 UI 交互期间会临时隐藏。
你也可以通过 refreshInterval 设置自动刷新间隔(单位秒,最小值 1),让状态栏定期更新而不必等待 Claude 回复。当显示基于时间的数据(如时钟)或后台子代理在主会话空闲时更改了 Git 状态时,这个设置很有用:
| 带自动刷新的状态栏配置 | |
|---|---|
可选的 hideVimModeIndicator 字段会抑制提示符下方的内置 -- INSERT -- 文本。当你的脚本自己渲染 vim.mode 时,将其设为 true,避免模式显示两次。
上下文窗口的两种计数方式¶
context_window 提供了两种视角:
- 累积总计(
total_input_tokens,total_output_tokens):整个会话中所有令牌的总和,用于跟踪总消耗量 - 当前使用情况(
current_usage):来自最近一次 API 调用的令牌计数,反映实际上下文状态
current_usage 对象包含四个子字段:
| 子字段 | 说明 |
|---|---|
input_tokens |
当前上下文中的输入令牌 |
output_tokens |
生成的输出令牌 |
cache_creation_input_tokens |
写入缓存的令牌 |
cache_read_input_tokens |
从缓存读取的令牌 |
used_percentage 字段仅从输入令牌计算(input_tokens + cache_creation_input_tokens + cache_read_input_tokens),不包括 output_tokens。在第一次 API 调用之前,current_usage 为 null。
完整 JSON 结构示例¶
缺失字段处理
在脚本中用条件访问处理可能缺失的字段,用回退默认值处理可能为 null 的值。例如 jq 中用 // 0,Python 中用 or 0,Node.js 中用 ?. \|\| 0。
实用脚本示例¶
上下文窗口使用进度条¶
Git 状态与颜色¶
显示 Git 分支,用颜色编码指示暂存(绿色 +)和修改(黄色 ~)文件数量:
可点击 GitHub 链接¶
使用 OSC 8 转义序列创建可点击链接,按住 Cmd(macOS)或 Ctrl(Windows/Linux)点击即可在浏览器中打开:
缓存昂贵的 Git 操作¶
状态栏脚本在活跃会话中频繁运行,git status 等命令在大仓库中可能很慢。用 session_id 作为缓存文件名,确保会话内稳定且跨会话唯一:
Windows 配置¶
Windows 上 Claude Code 优先通过 Git Bash 运行状态栏命令,没有 Git Bash 时回退到 PowerShell:
| settings.json — PowerShell 状态栏 | |
|---|---|
| statusline.ps1 | |
|---|---|
安装了 Git Bash 时也可以直接运行 Bash 脚本。在 Git Bash 中没有 jq 时,可以用 grep/cut 解析 JSON:
| statusline.sh — 无 jq 的 Git Bash 版本 | |
|---|---|
子代理状态行¶
subagentStatusLine 设置为代理面板中的每个子代理呈现自定义行体,替换默认的 name · description · token count 格式:
| 子代理状态行配置 | |
|---|---|
该命令在每个刷新周期运行一次,所有可见的子代理行作为单个 JSON 对象传入 stdin。输入包含钩子公共字段加上 columns(可用行宽)和 tasks 数组,每个任务有 id、name、type、status、description、label、startTime、tokenCount、tokenSamples 和 cwd。
向 stdout 写入 JSON 行 {"id": "<task id>", "content": "<行内容>"} 来覆盖对应行,省略 id 则保持默认渲染,content 为空字符串则隐藏该行。content 中的 ANSI 颜色和 OSC 8 超链接会原样渲染。
状态栏故障排除¶
| 问题 | 排查方向 |
|---|---|
| 状态栏未出现 | 确认脚本可执行(chmod +x)、输出到 stdout 而非 stderr、disableAllHooks 未设为 true |
显示 -- 或空值 |
第一次 API 响应完成前字段可能为 null,用 // 0 等回退值处理 |
| 上下文百分比异常 | 用 used_percentage 而非累积总计;total_input_tokens 可能超过窗口大小 |
| OSC 8 链接不可点击 | 确认终端支持(iTerm2/Kitty/WezTerm);Windows Terminal 可能需要设置 FORCE_HYPERLINK=1 |
| 转义序列显示乱码 | 用 printf '%b' 替代 echo -e 获得更可靠的转义处理 |
| 脚本挂起或报错 | 非零退出码或无输出会导致状态栏变空白;保持脚本快速执行 |
显示 statusline skipped |
需要接受当前目录的工作区信任对话框,重启 Claude Code 并接受信任提示 |
🔑 环境变量速查¶
Claude Code 通过环境变量提供细粒度的控制能力。常用环境变量速查如下,完整列表和详细说明请参见「环境变量参考」。
| 变量名 | 说明 | 示例 |
|---|---|---|
ANTHROPIC_API_KEY |
API 密钥 | sk-ant-... |
CLAUDE_CODE_USE_BEDROCK |
使用 AWS Bedrock | 1 |
CLAUDE_CODE_USE_VERTEX |
使用 Google Vertex AI | 1 |
DISABLE_AUTOUPDATER |
禁用自动更新 | 1 |
CLAUDE_CODE_DISABLE_FAST_MODE |
禁用 Fast Mode | 1 |
CLAUDE_CODE_PERFORCE_MODE |
Perforce 模式:只读文件操作提示 p4 edit 而非静默覆盖(v2.1.98 新增) |
1 |
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB |
启用子进程沙箱(PID 命名空间隔离,仅 Linux)(v2.1.98 新增) | 1 |
CLAUDE_CODE_SCRIPT_CAPS |
限制每会话脚本调用次数(v2.1.98 新增) | 10 |
NODE_EXTRA_CA_CERTS |
自定义 CA 证书路径 | /path/to/ca.pem |
💡 你可以在 settings.json 的 env 字段中设置环境变量,也可以在 shell 的 profile 文件(如 .bashrc)中设置。
🌐 公司有代理/防火墙怎么办?——企业网络配置¶
代理配置¶
在企业环境中,Claude Code 需要通过代理服务器访问外部 API。它尊重标准的代理环境变量:
如果代理需要认证,直接在 URL 中包含凭证:
自定义 CA 证书¶
如果你的企业使用自签名证书:
💡 v2.1.101 起:Claude Code 默认信任操作系统的 CA 证书存储,企业 TLS 代理通常无需额外配置。如果只需要内置 CA,设置
CLAUDE_CODE_CERT_STORE=bundled即可。
mTLS 双向认证¶
对安全性要求极高的环境可以启用 mTLS:
网络访问要求¶
确保防火墙允许访问以下域名:
| 域名 | 用途 |
|---|---|
api.anthropic.com |
Claude API 端点 |
claude.ai |
Claude.ai 账户认证 |
platform.claude.com |
Anthropic Console 认证 |
🎙️ 能用语音跟 Claude 对话吗?¶
什么是语音输入?¶
语音输入让你可以**按住一个键、说话、松开**——Claude Code 会把你的语音实时转写成文字,插入到提示框中。你可以混合使用语音和键盘输入。
启用方式¶
⚠️ 语音输入**仅支持 Claude.ai 账户认证**,不支持 API Key 或第三方云服务(Bedrock、Vertex AI 等)。此外,语音需要在本地录音,因此不支持 SSH 会话或 Web 版 Claude Code。
支持的语言¶
| 语言 | 代码 | 语言 | 代码 |
|---|---|---|---|
| 英语 | en |
法语 | fr |
| 德语 | de |
日语 | ja |
| 西班牙语 | es |
韩语 | ko |
| 中文(未列出) | — | — | — |
⚠️ 目前中文不在官方支持列表中。如果 language 设置为不支持的值,语音输入会回退到英语。
按键绑定¶
默认按住 Space 开始录音。你可以通过 ~/.claude/keybindings.json 重新绑定:
| ~/.claude/keybindings.json | |
|---|---|
💡 使用修饰键组合(如 meta+k)可以在第一次按下时立即开始录音,无需等待长按检测。
🕐 怎么安全地回退和撤销修改?——Checkpointing¶
为什么需要 Checkpointing?¶
当 Claude 在一个复杂任务中改了十几个文件,你突然发现方向跑偏了怎么办?手动 git checkout 太慢,而且不一定所有改动都提交过。Checkpointing(检查点)就是为这种场景设计的「会话级撤销」——它自动记录每次编辑前的代码状态,让你随时可以回到任意一个节点。
Checkpointing 如何工作¶
当 Claude 使用文件编辑工具修改文件时,Checkpointing 会自动捕获编辑前的代码快照:
- **每个用户提示**都会创建一个新的检查点
- 检查点在会话之间持久存在,恢复的对话中也能访问
- 30 天后自动清理(可配置)
怎么回溯?¶
按两次 Esc(Esc + Esc)或使用 /rewind 命令打开回溯菜单,会看到一个可滚动的会话提示列表。选择目标节点后,可以选择以下操作:
| 操作 | 效果 |
|---|---|
| 恢复代码和对话 | 代码和对话都回到该节点 |
| 恢复对话 | 只回溯对话,保持当前代码不变 |
| 恢复代码 | 只恢复文件修改,保持对话历史 |
| 从此处总结 | 将该节点之后的对话压缩为摘要,释放上下文窗口空间 |
| 算了 | 不做任何更改 |
恢复对话或总结后,所选消息的原始提示会恢复到输入框中,方便你重新发送或编辑。
恢复与总结的区别¶
三个「恢复」选项会撤销变更(代码、对话或两者),而「从此处总结」的工作方式不同:
- 所选消息之前的消息保持不变
- 所选消息及其后的所有消息被替换为 AI 生成的紧凑摘要
- 磁盘上的文件不会改变
- 原始消息保存在会话记录中,Claude 需要时可以参考详细信息
这类似于 /compact,但更有针对性——保持早期上下文的完整细节,只压缩占用空间的部分。你还可以输入可选说明来指导摘要的重点。
总结 vs Fork
总结会压缩当前会话的上下文。如果你想尝试不同的方法、同时保留原始会话完整,请改用 Fork(claude --continue --fork-session)。
适合什么场景?¶
- 探索替代方案:尝试不同实现方法,不丢失起点
- 从错误中恢复:快速撤销引入 Bug 或破坏功能的更改
- 迭代功能:做变体实验,随时可以恢复到工作状态
- 释放上下文空间:从中点开始总结冗长的调试会话,保持初始说明完整
有哪些限制?¶
Checkpointing 只跟踪通过 Claude 文件编辑工具进行的修改,以下情况不受覆盖:
Bash 命令修改的文件不受跟踪。例如 Claude 执行 rm file.txt、mv old.txt new.txt、cp source.txt dest.txt 等操作,这些变更无法通过回溯撤销。
外部修改不受跟踪。在 Claude Code 外部手动做的文件更改、其他并发会话的编辑,通常不会被捕获(除非恰好修改了当前会话涉及的文件)。
不是版本控制的替代品。Checkpoints 是「本地撤销」,Git 是「永久历史」。对于永久版本记录和协作,继续使用 Git 进行提交和分支管理。