>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Shell

如何在 tmux 中整理十几个运行中的 Claude Code 会话

当你在终端中启动 Claude Code 进行一些快速编辑时,一切都看起来很整洁。运行命令,给它一个任务,等待响应,然后关闭。当同时打开四五个项目时,问题就出现了。在一个仓库中,agent 正在重构测试,在另一个中它正在编写数据库迁移脚本,在第三个中它正在运行构建。

不到半小时,终端就变成了迷宫。不清楚 agent 在哪里等待命令确认,在哪里还在运行脚本,在哪里早已完成工作只是闲置着。你必须手动循环切换 tmux 窗口,浪费时间检查状态。

Tak Matsuyama 是 devas.life 博客的作者,也是 Neovim 和 tmux 几款流行工具的开发者,他推出了一个解决方案。他的插件 tmux-claude-session-manager 将分散的 agent 终端窗口变成一个整洁的列表,支持快速切换。

screenshot

插件功能

本质上,这是一个 Claude Code 在 tmux 中的任务管理器。该工具将 fzf 界面、tmux 内置的弹出机制和 Claude Code 自己的内部 API 结合在一起。

按下快捷键组合后会看到一个浮动窗口,其中列出了所有正在运行的会话。每个进程的状态一目了然:

  • working(agent 正在忙于生成或执行命令);
  • waiting(需要用户输入或确认);
  • idle(会话处于空闲状态);
  • 距离 agent 上次活动的时间。

需要关注的 agent 会自动移到列表顶部。旁边会显示通过 capture-pane 的屏幕实时预览。即使不切换到会话本身,你也能立即看到是什么问题让助手困惑。

按 Enter 键会直接进入目标窗口的上下文,并在弹出框架中打开会话。对话结束或 agent 完成工作后,按快捷键组合移除进程,会话会干净地关闭。

底层的有趣细节

这里没有自定义守护进程或重型 bash 钩子来解析 ps 输出。作者采用了更优雅的方式。

Claude Code 2.1.139 及以上版本可以通过内置的 claude agents --json 命令暴露其 agent 的信息。每个运行中的副本都会将其当前状态报告给本地监督器。插件只是通过 jq 读取这个 JSON。

主要技术挑战是将进程匹配到 tmux 窗格。例如在 macOS 上,窗格通常报告的是父 shell 的 PID,而不是子程序的 PID。在插件内部,agents.sh 脚本将标识符沿链连接:pid -> tty -> tmux 窗格。

由于这种绑定,插件跟踪的是进程而不是会话。如果你在一个项目中启动了三个不同的 agent,或者在常规相邻窗格中启动了 Claude(没有使用插件),该工具仍然会找到每个进程并将其显示为单独的一行。整个轮询只需要三个系统调用,因此界面运行没有延迟。

另一个巧妙的设计:如果在已经处于 Claude 弹出窗口中时打开选择菜单(prefix + u),插件会先分离当前弹出窗口,然后将选择窗口扩展到外部终端的完整大小。不会出现嵌套的俄罗斯套娃式不断缩小的框架。

安装和基本设置

需要 tmux 3.2 或更高版本(支持弹出功能)、已安装 fzf、jq 工具,以及最新的 Claude Code 版本。

如果使用 TPM 插件管理器,在 ~/.tmux.conf 配置文件中添加这行:

set -g @plugin 'craftzdog/tmux-claude-session-manager'

之后,按下 prefix + I 加载它。

默认情况下,插件使用两个快捷键组合:

  • prefix + y 在当前目录中启动新的 Claude 会话(弹出窗口中或连接到现有会话);
  • prefix + u 打开 fzf 选择器,显示所有活跃的 agent。

在列表窗口中,标准方向键和文本过滤功能正常工作。Enter 切换到选定的会话,Ctrl-x 强制终止进程。

参数很容易覆盖。例如,你可以为 Claude 本身设置启动标志或更改窗口尺寸:

set -g @claude_popup_width '85%' set -g @claude_popup_height '85%' set -g @claude_args '--dangerously-skip-permissions'

对于喜欢模态控制的用户,README 中有一个与 vim 风格布局集成的出色示例。你可以配置 fzf,使列表通过 j/k 以导航模式打开,切换到搜索模式使用 ia 键:

set -g @claude_fzf_options "\ --prompt 'nav> ' \ --bind 'j:down' \ --bind 'k:up' \ --bind 'q:abort' \ --bind 'x:execute-silent(kill {3})+reload(sleep 0.3; \$CLAUDE_PICKER --list)' \ --bind 'i:unbind(j,k,q,i,a,x)+change-prompt(filter> )' \ --bind 'a:unbind(j,k,q,i,a,x)+change-prompt(filter> )' \ --bind 'esc:rebind(j,k,q,i,a,x)+change-prompt(nav> )'"

值得安装吗

如果你每周只运行一次 Claude Code 处理几行代码,完全可以不用这个插件。常规的终端标签页就完全足够了。

该工具对于那些在终端中积极使用 agent 方式、在不同分支或子项目间并行处理任务的人很有用。插件消除了寻找正确标签页的繁琐,将后台任务监控集中在一个清晰的屏幕上。安装只需几分钟,脚本源代码紧凑透明,没有任何不必要的花招。

相关项目