本文档深入概述了 Tabby 的终端仿真功能,该功能是显示和交互终端会话的核心组件。Tabby 中的终端功能处理渲染、输入/输出处理、会话管理以及搜索、复制和粘贴等用户交互功能。
有关 SSH、本地 Shell、串行连接或 Telnet 等特定连接类型的信息,请参阅连接类型。有关终端 UI 组件的详细信息,请参阅终端 UI 组件。
Tabby 的终端功能围绕模块化架构构建,该架构将渲染与底层终端会话分离。这允许不同的前端实现和连接类型,同时保持一致的用户体验。
终端组件层级图
来源
终端架构包含以下关键组件
Tabby 中的终端功能遵循清晰的输入/输出数据流模式
终端数据流图
来源
终端输入/输出流如下
输入路径:
sendInput() 发送至活动会话输出路径:
output$ Observable 接收输出write() 写入前端Frontend 接口定义了终端渲染实现的契约。Tabby 目前提供了两种基于 xterm.js 的实现:XTermFrontend(基于 Canvas)和 XTermWebGLFrontend(基于 WebGL,性能更佳)。
| 方法 | 描述 |
|---|---|
attach(host, profile) | 将终端附加到 DOM 元素 |
write(data) | 将数据写入终端 |
getSelection() | 获取当前选定的文本 |
copySelection() | 将选定的文本复制到剪贴板 |
focus() | 聚焦终端 |
clear() | 清除终端内容 |
scrollToBottom/Top() | 滚动到缓冲区底部/顶部 |
scrollLines(amount) | 按行数滚动 |
scrollPages(pages) | 按页数滚动 |
findNext/Previous(term, options) | 在终端中搜索文本 |
来源
终端处理多种类型的输入和输出
键盘输入:
鼠标输入:
输出处理:
来源
终端提供全面的剪贴板功能
| 功能 | 描述 |
|---|---|
| 复制 | 将选定文本复制到剪贴板 |
| 复制为 HTML | 保留格式复制 |
| 粘贴 | 从剪贴板粘贴(带可选处理) |
| 全选 | 选定终端中的所有文本 |
| 选定即复制 | 选定文本时自动复制 |
值得注意的实现细节
可视响铃在终端上产生短暂的动画效果,而听觉响铃则播放声音。
来源
Tabby 支持缩放以调整终端字体大小
该实现将缩放因子应用于配置的字体大小
来源
终端提供各种滚动功能
| 方法 | 描述 |
|---|---|
scrollToTop() | 滚动到缓冲区开头 |
scrollToBottom() | 滚动到缓冲区末尾 |
scrollLines(amount) | 按特定行数滚动 |
scrollPages(pages) | 按特定页数滚动 |
这些方法在 BaseTerminalTabComponent 和 Frontend 接口中均有实现。
来源
Tabby 通过其配置系统为终端提供了广泛的配置选项。这些设置控制着终端的行为和外观。
| 设置 | 描述 | 默认值 |
|---|---|---|
frontend | 终端前端实现 | 'xterm-webgl' |
fontSize | 字体大小(像素) | 14 |
fontWeight | 普通文本的字体粗细 | 400 |
fontWeightBold | 粗体文本的字体粗细 | 700 |
bell | 终端响铃模式('off','visual','audible') | 'off' |
scrollbackLines | 缓冲区中保留的行数 | 25000 |
rightClick | 右键行为 | 平台相关 |
copyOnSelect | 选定文本时复制 | 平台相关 |
bracketedPaste | 使用括号粘贴模式 | true |
scrollOnInput | 输入时滚动到底部 | true |
来源
Tabby 为终端操作定义了各种快捷键
| 热键 | 功能 | 默认(Windows/Linux) | 默认(macOS) |
|---|---|---|---|
copy | 复制选区 | Ctrl+Shift+C | ⌘+C |
paste | 从剪贴板粘贴 | Ctrl+Shift+V | ⌘+V |
clear | 清除终端 | - | ⌘+K |
search | 在终端中搜索 | Ctrl+Shift+F | ⌘+F |
zoom-in | 增大字体大小 | Ctrl+= | ⌘+= |
zoom-out | 减小字体大小 | Ctrl+- | ⌘+- |
reset-zoom | 重置字体大小 | Ctrl+0 | ⌘+0 |
scroll-to-top | 滚动到顶部 | Ctrl+PageUp | Shift+PageUp |
scroll-to-bottom | 滚动到底部 | Ctrl+PageDown | Shift+PageDown |
来源
Tabby 使用 xterm.js 作为其终端仿真库,支持各种插件
xterm.js 集成图
来源
xterm.js 集成的关键方面
渲染引擎:
Terminal 功能:
性能优化:
来源
终端组件使用 RxJS Observables 进行事件处理和组件间通信
| Observable | 目的 |
|---|---|
input$ | 终端输入事件 |
output$ | 终端输出文本 |
binaryOutput$ | 终端二进制输出 |
resize$ | 终端大小调整事件 |
bell$ | 终端响铃事件 |
sessionChanged$ | 会话更改事件 |
alternateScreenActive$ | 追踪备用屏幕模式 |
frontendReady$ | 前端准备就绪通知 |
这种基于事件的架构实现了组件间的松耦合,并简化了异步操作。
来源
终端功能适应不同的平台(Windows、macOS、Linux),并具有平台特定的行为
Windows:
macOS:
Linux:
平台由 HostAppService 检测,并用于确定相应的行为。
来源
BaseTerminalTabComponent 管理终端会话的生命周期
终端会话生命周期图
来源
生命周期遵循以下步骤
Tabby 中的终端功能提供强大且功能丰富的终端仿真体验,支持多种平台特定行为、自定义选项和性能优化。模块化架构将渲染和会话管理分离,从而实现不同的前端实现和连接类型,同时保持一致的用户体验。