大概是人类对终端窗口数量的容忍度,是被 AI 编程助手逼着突破极限的。我印象最深的一天,电脑上同时挂着十一个终端标签:四个 Claude Code 会话分散在不同项目里,三个 Codex 窗口在各自跑任务,剩下的给日志、SSH 和零碎命令。结果就是想找某个任务的输出时来回点标签,忘了哪个窗口对应哪个项目,偶尔还会手滑关掉一个还活着的会话,把 AI 的上下文直接扼杀在摇篮里。那天之后我彻底想明白一件事:Claude Code 和 Codex 这类工具根本不是普通命令行程序,它们是带状态的长期会话,把它们塞进普通标签页里来回切换,是最糟糕的用法。
所以我后来把这两个 AI 助手都丢给了 Paseo。Paseo 是一个终端复用器,简单说就是能让你在一个窗口里管理多个持久化终端会话的工具。这篇文章就记录我为什么从标签页迁到 Paseo、具体怎么把 Claude Code 和 Codex 跑在里面,以及迁移过程中踩到的一堆真实问题。如果你也同时开多个 AI 编程会话、经常为窗口管理头疼,或是不确定终端复用器到底值不值得折腾,这篇应该能给你一个明确的答案。
1. Claude Code 和 Codex 的会话模式,和普通终端命令有什么不同
1.1 它们不是“跑一下就结束”的程序
很多人刚接触 Claude Code 或 Codex CLI 时,会把它理解成“一个能写代码的聊天机器人”——打开终端敲一句提示词,它回答完就结束了。这是最大的误解。
真实用法里,Claude Code 和 Codex 是会持续工作的 Agent。你可以让 Claude Code 去做一次跨多文件的重构,它自己读代码、改文件、跑测试,运行十几分钟甚至更久。这个过程里,你有大量时间盯着输出。更关键的是,它们保留完整的对话上下文。你上午开一个会话让它研究某个模块,下午继续接着聊,它会记得之前的所有结论。
这就引出一个问题:这种长生命周期的工具有状态、有上下文、有执行中的任务。关掉终端窗口就等于杀掉任务,再想继续只能从头再来。于是你不敢关窗口,只能让它一直挂着。挂得多了,终端标签页就开始失控。
1.2 终端标签页方式管理会话的崩溃时刻
我自己的崩溃经历大概有三类,估计你也遇到过:
第一类,上下文错位。开着四五个标签页,每个里面都是 Claude Code 的工作会话,但没有一个标签的名字写着“这是哪个项目”。只要隔一晚上,第二天基本要靠猜,或者用查看当前目录的方式逐个进去确认。
第二类,误关窗口。终端里跑着长任务,手一抖把标签关了。虽然各种终端工具都有撤销关闭的功能,但 AI 会话的状态是存在于进程里的,进程没了,上下文就没了。那种感觉就像写了一个小时的方案,还没保存就断电。
第三类,无法并行观察。需要同时看两个会话的输出时,系统自带终端的分屏能力太弱。我想让 Claude Code 在左边重构,Codex 在右边写测试,再把日志放下面滚动——自带终端根本做不到这种布局。
1.3 我需要的“会话调度器”到底是什么
在投降之前我列了一个需求清单:
- 会话必须有名字。一打开列表就知道哪个会话在做什么任务。
- 我能随时“离开”一个会话,但任务继续在后台跑。
- 几分钟后我还能“回到”这个会话,看到最新的输出。
- 一个窗口内能灵活分屏,让多个会话同时可见。
- 断网、SSH 断开、终端软件重启,都不能杀死会话。
这套需求不是新的。玩过服务器的人肯定知道,这正是 tmux 的看家本领:会话持久化、分离与重挂、多窗口多窗格。本质上我需要的是一个终端复用器,而不是又一个花哨的标签页工具。这也是为什么我看到 Paseo 后眼前一亮——它就是用这套逻辑设计的,而且为 AI Agent 的交互做了不少优化。
2. 为什么我会从一堆标签页切到 Paseo
2.1 Paseo 在终端工具谱系里的定位
Paseo 和 tmux、Zellij 一样,属于终端复用器(terminal multiplexer)这个品类。它跟普通终端标签页的区别在于:普通标签页由终端模拟器管理,关了窗口一切结束;而终端复用器启动一个独立的 server 进程,所有会话都挂在 server 上,窗口界面只是它的一个“客户端”。关掉客户端,会话照样在服务器端跑着。
对 AI 编程助手来说,这个特性几乎是为它们量身定做的。Claude Code 的一个会话可能持续几小时,Codex 跑一个任务也可能很久,这期间你不可能一直守在同一个窗口前。有了 Paseo,你可以把每个会话当成一个“后台工位”,随时过去看一眼,干别的活时也不用担心会话死掉。
2.2 和 tmux、Zellij、Tabby 的横向对比
我实际用过 tmux、Zellij,也用过 Tabby 这种现代终端模拟器,对比下来每个工具的侧重点不同。
| 工具 | 会话持久化 | 分屏布局 | 上手成本 | 对 AI CLI 交互的友好度 | 资源占用 |
|---|---|---|---|---|---|
| tmux | 很强 | 强,但配置繁琐 | 中等,键位要学 | 一般,默认配置需要自己调 | 很低 |
| Zellij | 很强 | 强,布局更现代 | 较低,有提示栏 | 较好,界面清晰 | 低 |
| Tabby | 弱,标签页不跨进程持久 | 一般 | 低 | 一般,只是普通终端 | 较高 |
| Paseo | 很强 | 强,操作直观 | 较低 | 明显做了针对性设计 | 低 |
这一列下来,Paseo 不是简单复刻 tmux,它在交互上更像一个“面向 Agent 时代的终端工作台”。如果你用 tmux 觉得很爽只是嫌配置太折腾,用 Zellij 觉得布局不错但想更轻一点,那 Paseo 大概就是那个折中答案。
2.3 Paseo 真正打动我的三个细节
第一点是会话命名与描述系统。Paseo 允许用类似paseo new -s claude-refactor -d "后端接口重构"的方式创建带描述的会话。我能一次性看到所有会话的意图,而不是靠猜。
第二点是长输出渲染。Claude Code 和 Codex 经常一口气打印很长的代码块或日志,普通终端在滚动这些内容时会卡顿。Paseo 在处理这种高频流式输出时明显更平滑,代码块的结构也更清晰。
第三点是配置轻量。tmux 想用得舒服需要写不少自定义配置,Paseo 的开箱默认就能满足我大部分需求。对于只想赶紧把 Agent 用起来的人来说,这种省心非常关键。
3. 把 Claude Code 完整搬进 Paseo 的实操记录
3.1 安装和第一个会话的创建
我的环境是 macOS,用 Homebrew 安装很方便:
brew install paseoLinux 用户一般可以用包管理器安装,或者直接发布页拉二进制文件。装完先确认版本:
paseo --version安装完成后,我做的第一件事是规划会话命名规则。我的习惯是工具-项目-任务三段式,比如:
claude-web-api:Claude Code 负责 Web 项目的 API 重构claude-blog-deploy:Claude Code 处理博客部署脚本codex-data-sync:Codex 写数据同步脚本
创建会话走进 Claude Code:
paseo new -s claude-web-api -d "重构 web 项目的 API 层" paseo attach -s claude-web-api cd ~/projects/web claude这一步之后,Claude Code 就完整运行在 Paseo 的会话里了。你可以正常聊天、让它跑命令、看它读写代码,体验和直接在终端里跑没有任何区别。
3.2 核心三步曲:分离、重挂、列表
这才是终端复用器的精髓,也是我日常用到最多的三个操作。
分离会话:我正在 Claude Code 里让它做一次大型重构,预计要跑十分钟。这时候不需要一直盯着。默认情况下按前缀键后再按d就能分离。我自己的键位设置成了Ctrl+Space,所以实际操作是Ctrl+Space然后d。分离后,你会回到 Paseo 的会话列表,但 Claude Code 并没有退出,它在后台继续跑着。
重挂会话:干完别的活,想回去看看进展。执行:
paseo attach -s claude-web-api一下子就回到了那个会话,屏幕上的输出已经滚了一屏,能看到 Claude Code 最新做了什么。这里的体验非常像登录服务器后恢复一个 tmux 会话,一切状态都还在。
查看列表:
paseo ls会列出所有会话,带名称、描述、创建时间、最后活动时间。我每天早晨第一件事就是先paseo ls,像看任务看板一样确认昨天的任务在哪个会话里。
这里有个容易忽略的点:分离时如果 Claude Code 正在执行一条终端命令,分离操作不会打断它。但如果你正在等待一个输入提示符,比如 Claude 问你是否继续,这时候分离再回来,输入符还在等着你。Claude Code 不会因为无人应答就自行中断,这一点比其他很多命令行工具都强。
3.3 用会话列表搭出一个“任务看板”
既然会话有名字和描述,我干脆把它当任务看板用。每个会话就是一张卡片,描述就是任务说明。有个会话干完了,我就关掉;有新想法,就新建一个。看板没有离开终端,但所有任务清清楚楚。
举个例子,我同时处理三件事:
paseo new -s claude-docs-cn -d "把 README 翻译成中文,等待 review" paseo new -s claude-bug-127 -d "排查登录接口偶发 500 错误" paseo new -s claude-benchmark -d "跑一次性能基准测试,对比缓存优化前后"然后需要并行的时候就分屏,需要专注的时候就全屏单会话。这种方式比在标签页上贴便利贴强太多了。
3.4 Claude Code 在 Paseo 里的三个交互细节
实际跑了一段时间后,我总结出三个值得注意的细节。
第一个是工作目录绑定。Claude Code 能在哪个项目下操作,取决于你启动它时所在的目录。所以在 Paseo 会话里,我一般先cd到项目根目录再启动 claude。如果顺序搞反了,后面让它改文件时会出现“文件不存在”的尴尬。
第二个是长日志回查。Claude Code 可能会连续输出几百行内容,屏幕肯定装不下。Paseo 支持进入滚动模式回看输出历史,类似 tmux 的 copy-mode。滚动模式下可以用方向键或翻页键慢慢查看之前的输出,不需要重新跑一次任务。这个查看历史的能力在排查错误时非常有用。
第三个是颜色主题。Claude Code 输出内容里有大量代码块、diff、错误信息,自带的高亮在浅色背景下基本抓瞎。我建议给 Paseo 配一个深色主题,并把终端模拟器的 font-ligature 功能打开,这样代码里的=>和->渲染得更清晰,AI 输出里的长段落也更好扫读。
4. Codex 接进来之后的三个坑和完整排查记录
把 Claude Code 搬进 Paseo 还算顺利,Codex 就没有那么走运了。这玩意儿接入后踩了三个坑,其中一个还颇有典型性,值得单独写一段。
4.1 登录态与会话隔离问题
Codex CLI 在第一次使用时需要登录授权。如果你是在普通终端里完成登录的,那状态一般存在用户目录的配置里。但是,如果 Codex 跑在 Paseo 的某个会话里,而你登录时中断了验证流程,可能出现一个奇怪的状态:在 Paseo 里跑codex提示未登录,切回普通终端却一切正常。
我遇到的情况是:Paseo 会话继承的 shell 环境变量里有CODEX_API_KEY之类的旧值,导致 Codex 以为已经有登录态了,跳过交互登录,结果真正调用时发现 key 无效。排查了半天才意识到是环境变量残留。
建议的做法是:在 Paseo 会话里启动 Codex 前,用env | grep -i codex检查有没有残留变量。如果发现可疑变量,用unset清掉,再让 Codex 走一次正式的交互式登录。或者更省事:直接在系统层面配好官方提供的统一认证配置,这样不管在 Paseo 还是普通终端里都能复用同一套凭据。
4.2 cc switch 配置第三方模型时的 local proxy failed
这是我最想详细写的一个坑。热搜词里有一条很典型的报错:local proxy failed while handling codex endpoint /responses. provi...,我猜不少人都被这条报错卡过。
先说背景。cc switch是一个能在 Claude Code 和 Codex 之间切换不同模型供应商的工具。国内开发者经常拿它来接入 DeepSeek、Qwen、GLM 这些第三方模型。它的工作方式是在本地启动一个代理端点,Codex 发出请求后,请求先打到这个本地代理,再被转发到目标模型服务。
那种报错,简单说就是本地代理在接收 Codex 请求时出错了,代码在转发阶段匹配失败。完整排查链路我走了一遍,以下是顺序:
第一步,确认代理进程还活着。
lsof -i :<端口号>看看监听端口对应的是不是 cc switch 自己拉起的进程。端口空了,什么也不用查,先把服务跑起来再说。
第二步,检查 Codex 的配置。
Codex 客户端需要知道自己该把请求发到哪。如果配置里没有写baseURL指向http://localhost:<端口号>,实际请求会打到 Codex 默认的官方端点,那么 cc switch 根本拦不到流量。这个是最常被忽略的问题——服务启动了,端口也活着,但请求压根没经过它。
第三步,检查 cc switch 自己配置的模型映射。
它收到 Codex 的请求后,得知道要转发给哪个供应商。如果映射关系写错了,比如模型名对应不上,代理在拿到/responses请求时可能直接拒绝转发。把这个映射关系打印出来确认一下就能发现。
第四步,看日志。
cc switch 一般会输出详细日志,直接顺藤摸瓜找到具体异常。反正我最终定位到的根因是配置文件里 model 名与供应商支持的模型列表不匹配,导致代理端返回了无效响应,Codex 这边的 TUI 就直接把这个异常显示成了 local proxy failed。
这条报错本身不影响 Paseo,但它恰恰发生在我把 Codex 接入 Paseo 之后。在 Paseo 的分屏里,左边是 Claude Code,右边是 Codex 和 cc switch 的代理输出,两边对照着查问题非常高效。这种事发生在多窗口时代,我估计得来回切四个标签才能理清头绪。
4.3 Codex 在 Paseo 里的渲染和挂起问题
第三个坑是重挂会话时 Codex 的 TUI 界面偶尔会花掉,光标位置不对,或者界面重绘不完整。
这种情况在 tmux 环境里也很常见,本质是终端序列兼容性问题。Codex 的交互式界面会使用较新的终端控制序列,Paseo 是头一回见,可能导致部分渲染状态没同步。
我的解决办法很土但有效:重挂会话后先按Ctrl+L清一次屏,强制 Codex 重新绘制整个界面。如果还卡着,就按一下回车,看它是不是在等待输入。Codex 进程本身并没有死,只是界面没跟上,唤醒一下就好了。另外,如果你在 Codex 等待确认某个操作时分离了会话,过段时间再回来,可能会看到输入框还在等待你的指令。这时候检查一下它的任务状态,别一上来就按 Ctrl+C,可能把跑了一半的任务打断。
5. 现在我的真实工作流长什么样
5.1 一块屏幕上的三窗布局
把两个 AI 助手都放进 Paseo 之后,我固定的布局方案是这样的:
上下结构,上半部分两个并排窗口:左边是 Claude Code 主力会话,右边是 Codex 主力会话。下半部分留一个窗口专门放日志和临时命令。这样布局的好处是左边让 Claude 重构,右边让 Codex 写测试,底部看两者的运行日志,哪个有异常一眼就能看到。
我实际测试过,这种布局跑一整天下来,整个 Paseo 进程占用大约一两百兆内存,远小于我再开四个终端标签加三个 Web 页面的开销。终端复用器在资源效率上的优势是实打实的。
5.2 快捷键和肌肉记忆
Paseo 的操作基本都是围绕着前缀键展开的。我把默认前缀改成了Ctrl+Space,因为这个组合键在常规终端里几乎没被占用,也不会误触。几个天天用的快捷键:
Ctrl+Space+d:分离当前会话Ctrl+Space+["或]:切换上一个/下一个窗口Ctrl+Space+v或s:垂直或水平分屏Ctrl+Space+z:临时最大化当前窗格Ctrl+Space+c:新建窗口
刚开始用的时候,最需要适应的是“分离”这个动作。大多数人习惯关标签页来结束工作,但在 Paseo 里,分离并不结束任务,只是表示“我现在不看了”。心态上切换过来之后,效率会提升非常明显。
5.3 长期运行的资源管理与日志习惯
两个 Agent 同时跑,时间久了难免产生大量输出。我现在的习惯是:每个会话跑大任务前,先在系统里明确标记好目标文件路径,这样即使看漏了哪步,想查找记录也有迹可循。另外,Claude Code 和 Codex 都是长期运行的 Agent,隔几天我会给它们手动清理一次上下文,或者直接重新生成一个新会话,保持对话历史的干净。
有个很容易踩的坑是:不要用paseo kill来结束一个还跑着 Codex 的会话。这相当于直接杀掉进程,Codex 可能连配置都没有来得及写回,导致部分会话状态丢失。正确操作是先让 Codex 自己退出(比如输入/exit),再关闭 Paseo 会话。
最后再分享一个我现在非常依赖的小习惯。每天早上打开电脑,我先paseo ls看一遍所有会话的列表,把每个会话的最近活动时间在心里过一遍。这个列表现在就像我的任务看板,只不过它不在任何网站上,而在终端里。有时候我也觉得自己从一个极端的窗口管理爱好者变成了一句话的终身复用党——但说实话,比起那十一个标签页的兵荒马乱,我更喜欢现在这种把 AI 会话放在“工位”上随叫随到的状态。如果你手头也同时跑着 Claude Code 和 Codex,或者几个长期会话即将把你淹没,试一试 Paseo 这种玩法,大概率回不去了。