PTY output进阶处理

26 年 6 月 18 日 星期四
915 字
5 分钟

问题:

前端 JS 完全无法分清PTY才传回的字节流中的命令结构: 它无法区分哪部分是 Prompt,哪部分是命令输入,哪部分是命令输出,只能将原始字节流write到终端界面。 预期:边界标记与状态追踪的工作应该交给后端处理。

一些参考的横向:

1.Warp

Warp 是一个 AI 驱动的现代化终端。 Warp 将整个终端界面划分为一个个结构化的 Block(块),类似于 AI 对话中的一轮轮交互。取代传统终端无限滚动的线性输出方式。

每个 Block 包含三部分: Prompt(提示符)+ Input(输入)+ Output(输出)。

交互逻辑的变化: 用户的操作对象从传统的“逐条输入/输出命令”转变为对 Block 的整体管理。每个 Block 的右上角提供快捷操作按钮,如复制输入、复制输出等。

Warp 特性:

  • 当前选中的 Block 会高亮显示,方便定位;用户可将 Block 收藏或置顶。
  • 对于包含长文本输出的 Block,支持快速导航至其顶部或底部。
  • Block 支持一键分享,也可直接嵌入博客或文档中,便于协作与记录。

参考:https://docs.warp.dev/

2.Jupyter Notebook Bash Kernel

Jupyter Notebook 支持多语言内核,用户可根据需要无缝切换编程环境

Jupyter Notebook Bash Kernel Jupyter 本身以独立的单元格(Cell)为单位执行代码,运行结果会直接嵌入在当前 Cell 下方,形成“输入—输出”配对的结构。

将默认的 Python 内核替换为 Bash 内核后,Notebook 能够直接执行 Shell 命令。此时,每一个 Cell 便等价于一个 Shell 命令片段,其标准输出和错误输出也会被捕获并展示在对应 Cell 中。

Warp 的 Block(块) 设计思路和cell的思想有点相似。不知道 Warp 中 Block 的实现有没有参考过Jupyter 的 Cell 模型

3.VSCode Shell Integration

在旧版 VSCode 终端中,缺乏有效的机制来区分终端输出中的 Prompt(提示符)用户输入的命令 以及 命令的实际输出。VSCode 在 v1.93 版本中引入了 Terminal Shell Integration API,为终端内容提供结构化的解析。 具体做法: VSCode Shell Integration 在启动终端时,会根据用户选择的 Shell 类型自动注入一段初始化脚本。该脚本利用不同 Shell 提供的 Hook(Prompt、PreExec、PreCmd 等),在 Prompt 显示、命令开始、命令结束等关键时机向终端输出特定的 ANSI 转义序列(OSC 633等)

ANSI 转义序列 本质上是一种嵌入在终端文本流中的带内信令(In-band Signaling):它与普通输出共享同一条 stdout 数据流,但不会被终端直接显示,而是由终端模拟器解析为控制指令。VSCode Terminal 正是通过识别这些转义序列,获知命令边界、Prompt、退出码等事件,从而实现 Shell Integration。

前端解析这些序列后,可实现:

  1. 明确边界条件:能够精确识别每个命令的输入区域和输出区域,清晰界定命令的起止位置。
  2. 追踪命令状态:获知命令何时开始执行、执行是否成功或失败,从而为扩展提供更丰富的交互反馈

总结:

warp和jupyter notebook bash kernel不开源,只参考到了他们对每轮命令的处理,属于是解决当前问题后才可参考的进一步实现。想真正实现,还要借鉴Vscode的处理,实现终端从字符流升级成结构化命令流

文章标题:PTY output进阶处理

文章作者:indulgein

文章链接:https://indulgein.top/posts/xterm-2[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。