claude code × tmux
让 tmux 重新看见
Claude Code 在忙
开了一排 Claude Code 窗口,以前一眼就知道哪个还在跑。升级之后全都静止了。四条 hook 把它找回来,顺手还多了一个「等你点确认」的提示。
它长什么样
tmux 的窗口列表(prefix + w)里,每个窗口后面引号里那段字就是 Claude Code 写的终端标题。装好之后前面的符号会跟着状态变:
(0) - cc: 5 windows (attached)
(1) ├─> 0: claude: "⏳ 大逃亡"
(2) ├─> 1: claude: "✳ 大扫除"
(3) ├─> 2: claude: "❗ 救命啊"
(4) ├─> 3: claude: "⏳ 大冒险"
(5) └─> 4: claude: "✳ 大写C 魔法"
| 符号 | 意思 | 什么时候变 |
|---|---|---|
| ⏳ | 在跑 | 你按下回车提交、或它开始调用工具 |
| ❗ | 等你 | 弹出权限确认之类要你点一下的东西 |
| ✳ | 闲着 | 这一轮回答结束 |
为什么没了 背景
以前 Claude Code 每 960 毫秒把终端标题重写一次,前面的 ✳ 轮着换成转圈的字符,所以窗口列表里能看出谁在动。2.1.236(2026-08-19)把它改掉了,理由是标题不停抖:
Fixed terminal tab titles jumping in tmux (iTerm tmux integration): the title is now written only when its text changes instead of animating every 960ms Claude Code CHANGELOG · 2.1.236
之后标题只在会话名变化时写一次,没有任何忙 / 闲信号,也没有设置项可以调回去。所以自己写。
装 三十秒
需要:Linux 或 macOS,tmux,python3(改 settings.json 用)。一条命令:
curl -fsSL https://lab.sumi5.top/install.sh | bash
它做三件事,都可逆:把 脚本放到 ~/.claude/;备份你现有的 ~/.claude/settings.json;往里追加下面四条 hook(已有的内容不动)。
不想跑别人的安装脚本?手动三步在这里。
- 放脚本
mkdir -p ~/.claude curl -fsSL https://lab.sumi5.top/claude-tmux-busy-hook.sh -o ~/.claude/claude-tmux-busy-hook.sh chmod +x ~/.claude/claude-tmux-busy-hook.sh - 加 hook 在
~/.claude/settings.json里合并进去(路径换成你的家目录绝对路径):{ "hooks": { "UserPromptSubmit": [{"hooks":[{"type":"command","command":"/home/你/.claude/claude-tmux-busy-hook.sh busy"}]}], "PreToolUse": [{"hooks":[{"type":"command","command":"/home/你/.claude/claude-tmux-busy-hook.sh busy"}]}], "Notification": [{"hooks":[{"type":"command","command":"/home/你/.claude/claude-tmux-busy-hook.sh wait"}]}], "Stop": [{"hooks":[{"type":"command","command":"/home/你/.claude/claude-tmux-busy-hook.sh idle"}]}] } } - 新开一个 claude 已经在跑的会话不会变,新开的才带 hook。
验证
在 tmux 里新开一个 claude,随便让它跑个几秒的命令,比如「run: sleep 5」,然后按 prefix + w 看列表:标题应该先是 ⏳,跑完变回 ✳。或者直接问 tmux:
tmux display -p '#{pane_title}'
原理
脚本只有十几行。Claude Code 每次触发 hook 时会把 TMUX_PANE 传给它,脚本据此找到那个窗格的 tty,读出当前标题,去掉旧符号,换上新符号,再用终端标准的 OSC 0 序列写回去。不碰 tmux 的窗口名,不依赖终端软件,iTerm、Ghostty、Windows Terminal 里 ssh 到服务器都一样。
(加载中)
已知的小毛病
- 每个会话的第一轮,Claude 自己生成会话名时会把标题写回 ✳ 一次,下一次工具调用又变回 ⏳,前后约一秒。
- 标题是 Claude Code 生成的会话名,如果你用
/rename改过名,显示的就是改过的。 - 只影响 tmux 里的 pane_title。tmux 外面的终端标签页标题本来就跟着变,不需要这个。
顺手的 tmux 设置
把窗口列表绑到大写 W,按一下就是上面那张图;大写 C 直接开新窗口:
# ~/.tmux.conf
bind W choose-tree -Zw
bind C new-window