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(已有的内容不动)。

不想跑别人的安装脚本?手动三步在这里。
  1. 放脚本
    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
  2. 加 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"}]}]
      }
    }
  3. 新开一个 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 到服务器都一样。

(加载中)

已知的小毛病

顺手的 tmux 设置

把窗口列表绑到大写 W,按一下就是上面那张图;大写 C 直接开新窗口:

# ~/.tmux.conf
bind W choose-tree -Zw
bind C new-window