菜单

终端功能

相关源文件

本文档深入概述了 Tabby 的终端仿真功能,该功能是显示和交互终端会话的核心组件。Tabby 中的终端功能处理渲染、输入/输出处理、会话管理以及搜索、复制和粘贴等用户交互功能。

有关 SSH、本地 Shell、串行连接或 Telnet 等特定连接类型的信息,请参阅连接类型。有关终端 UI 组件的详细信息,请参阅终端 UI 组件

终端架构

Tabby 的终端功能围绕模块化架构构建,该架构将渲染与底层终端会话分离。这允许不同的前端实现和连接类型,同时保持一致的用户体验。

终端组件层级图

来源

终端架构包含以下关键组件

  1. BaseTerminalTabComponent:负责处理终端标签页、用户交互和会话管理的核心 Angular 组件
  2. Frontend:一个定义终端渲染能力的接口
  3. XTermFrontend/XTermWebGLFrontend:使用 xterm.js 和不同渲染引擎的具体实现
  4. BaseSession:终端会话(SSH、本地、串行等)的接口

终端数据流

Tabby 中的终端功能遵循清晰的输入/输出数据流模式

终端数据流图

来源

终端输入/输出流如下

  1. 输入路径:

    • 用户通过键盘、鼠标或粘贴操作提供输入
    • BaseTerminalTabComponent 处理输入
    • 输入通过 sendInput() 发送至活动会话
    • 会话处理输入并生成输出
  2. 输出路径:

    • 会话产生输出
    • BaseTerminalTabComponent 通过会话的 output$ Observable 接收输出
    • 输出通过 write() 写入前端
    • 前端使用 xterm.js 渲染输出

前端接口

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)在终端中搜索文本

来源

Terminal 功能

输入/输出处理

终端处理多种类型的输入和输出

  1. 键盘输入:

    • 常规字符输入
    • 控制序列 (Ctrl+C, Ctrl+D 等)
    • 导航和编辑键
  2. 鼠标输入:

    • 选择
    • 上下文菜单
    • 中键粘贴
    • 鼠标滚轮滚动
  3. 输出处理:

    • 文本渲染
    • ANSI 控制序列
    • 颜色和格式
    • 响铃信号(视觉/听觉)

来源

剪贴板操作

终端提供全面的剪贴板功能

功能描述
复制将选定文本复制到剪贴板
复制为 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+PageUpShift+PageUp
scroll-to-bottom滚动到底部Ctrl+PageDownShift+PageDown

来源

xterm.js 集成

Tabby 使用 xterm.js 作为其终端仿真库,支持各种插件

xterm.js 集成图

来源

xterm.js 集成的关键方面

  1. 渲染引擎:

    • 用于最佳性能的 WebGL 渲染器
    • Canvas 渲染器作为备用
  2. Terminal 功能:

    • 通过 Unicode11 插件支持 Unicode
    • 字体连字支持
    • 通过 Fit 插件调整终端大小
    • 搜索功能
    • 用于保存/恢复终端状态的状态序列化
    • 支持 Sixel 图形以显示图像
  3. 性能优化:

    • 流量控制,防止大量输出时 UI 阻塞
    • 显示度量变化时清除纹理图集
    • 标签页可见性处理,以减少隐藏标签页的资源使用

来源

终端事件与通信

终端组件使用 RxJS Observables 进行事件处理和组件间通信

Observable目的
input$终端输入事件
output$终端输出文本
binaryOutput$终端二进制输出
resize$终端大小调整事件
bell$终端响铃事件
sessionChanged$会话更改事件
alternateScreenActive$追踪备用屏幕模式
frontendReady$前端准备就绪通知

这种基于事件的架构实现了组件间的松耦合,并简化了异步操作。

来源

平台特定行为

终端功能适应不同的平台(Windows、macOS、Linux),并具有平台特定的行为

  1. Windows:

    • 默认右键进行剪贴板操作
    • 默认选定即复制
    • Windows 特定的单词跳转组合键
  2. macOS:

    • 使用 cmd 键作为键盘快捷键
    • 不同的导航组合键
    • 不同的默认字体
  3. Linux:

    • 平台特定的组合键
    • 默认选择不同的字体

平台由 HostAppService 检测,并用于确定相应的行为。

来源

终端会话生命周期

BaseTerminalTabComponent 管理终端会话的生命周期

终端会话生命周期图

来源

生命周期遵循以下步骤

  1. 终端标签页组件初始化
  2. 前端附加到 DOM 元素
  3. 前端准备就绪后,可以附加会话
  4. 前端和会话之间开始输入/输出流
  5. 会话关闭时,终端标签页可能会根据配置被销毁

结论

Tabby 中的终端功能提供强大且功能丰富的终端仿真体验,支持多种平台特定行为、自定义选项和性能优化。模块化架构将渲染和会话管理分离,从而实现不同的前端实现和连接类型,同时保持一致的用户体验。