跳转到内容
moshpit

滚动为什么比看起来难

  • 普通 shell 里:翻的是真正的回滚,历史输出存在手机本地。连上 tmux 时 Moshpit 会先把这个窗格最近的历史拉下来,所以你连上之前打印的内容也翻得到。
  • 全屏程序里:手势变成滚轮事件转发给程序,由程序自己滚。期间打字不受影响。

在普通 shell 窗格里往回翻:一个 webhook 服务器几分钟的请求日志

在 tmux 上,Moshpit 问 tmux 这个窗格的程序有没有接管鼠标,按回答分流。在 herdr 上连问都不用问:滚动是协议动作,由服务端决定它是鼠标事件还是翻历史。这是 herdr 悄悄占优的地方之一。

窗格还在打印时往上翻,本来是一场拉锯:你刚翻上去,下一波输出又把画面拽回底部。Moshpit 会在你翻上去期间攒着新输出,等你回来再一次补上。往下滚到底,或者直接打字,画面立刻回到实时状态,一个字节不少。

滚 tmux 窗格最直接的办法是 tmux 自己的 copy-mode。但它恰好和 Moshpit 与 tmux 的对话方式冲突。Moshpit 走的是控制模式,而 tmux 只给普通终端客户端画 copy-mode。控制模式客户端在 copy-mode 滚动期间什么都收不到。更麻烦的是,进入 copy-mode 是服务端的状态。连着同一个窗口的桌面终端会跟着你一起进 copy-mode。所以在 SSH+tmux 上,上滑从不碰 copy-mode,回滚放在手机上。mosh+tmux 是另一回事:那条路上的渲染器就是普通客户端,copy-mode 反而是对的工具,见那一页。

  • 不用多路复用器:回滚就是 App 自己为这个会话留在内存里的那部分。断开后什么都不保留。
  • SSH+tmux:本地缓冲在连上时只预载窗格历史最近的一段,不是全部。完整的回滚还在 tmux 服务端。
  • herdr:翻历史由服务端按需完成。herdr 没有导出整段回滚缓冲的 API,所以本地没有可搜索的副本。
  • Mosh:协议传的是可见画面,不是字节流。回滚属于里面跑的多路复用器,不属于 Mosh。