Tabby 修改版:更美观的现代终端
侵权声明:本文为原创技术分享,如有侵权行为,请通过以下方式联系我们下架处理:
- 邮箱:jzh@879869954@163.com
目录
- [为什么给 Tabby 做二次开发](#为什么给 Tabby 做二次开发)
- [核心增强一:SSH 服务器资源监控面板](#核心增强一:SSH 服务器资源监控面板)
- 核心增强二:命令历史候选提示
- 核心增强三:终端语义高亮
- 核心增强四:远程目录同步
- [核心增强五:SSH 配置导入导出与分组管理](#核心增强五:SSH 配置导入导出与分组管理)
- 界面优化:从细节打磨到窗口重构
- [原版 vs 二开版功能对比](#原版 vs 二开版功能对比)
- FAQ
- 结语
为什么给 Tabby 做二次开发
Tabby 是一款基于 Electron + Angular + xterm.js 的开源终端模拟器,跨 Windows / macOS / Linux 三端,原生集成了 SSH 客户端、SFTP、串口终端、分屏、主题等能力,是 PuTTY、iTerm 的强力替代品。日常运维使用中,我们逐渐积累了几个原版难以满足的诉求:
- 连接 Linux 服务器后,想看 CPU、内存、磁盘、网络负载,得手动敲
top、df -h、nload,繁琐且不直观; - 终端没有命令自动补全,长命令反复敲,效率低;
- 日志刷屏时,
error、warning、IP、路径混在一起,一眼看不出重点; - SSH 配置一多,没有分组、没有批量导入导出,换机器就要重新配置一遍;
- 原生界面略显陈旧:标签页、滚动条、窗口边框都不够精致。
核心增强一:SSH 服务器资源监控面板
这是本次改造最核心的功能。连接 SSH 后,窗口右侧会常驻一个服务器监控面板 ,无需额外安装任何远端 Agent,直接通过 SSH exec 通道读取 Linux 的 /proc 文件系统来采集数据。
面板包含五个页签:
| 页签 | 监控内容 | 数据来源 |
|---|---|---|
| 总览 | CPU 使用率、内存、磁盘、网络、运行时长、负载 | /proc/stat、/proc/meminfo、/proc/uptime 等 |
| 处理器 | 各核心使用率与历史曲线(保留 60 个采样点) | /proc/stat |
| 内存 | 总量/已用/可用/缓存,含使用率进度条 | /proc/meminfo |
| 磁盘 | 各挂载点容量与使用率(过滤 tmpfs/overlay) | df -P -B1 |
| 网络 | 收发字节、速率(Rx/Tx)、错误计数 | /proc/net/dev |
实现上有几个值得说明的细节:
- 零依赖采集 :把多条采集命令拼接成一条
echo "@@TABBY_MON_XXX@@"分隔的复合命令,一次性requestExec取回,再用分隔符切段解析,把 SSH 往返开销降到最低; - 3 秒刷新 + 30 秒缓存:面板每 3 秒刷新一次,同时做 30 秒的静态缓存,多开标签页时共享,避免重复采集;
- 可拖拽调宽:面板宽度支持在 280px~500px 之间拖拽调整,适配不同屏幕;
- CPU 历史曲线:保留最近 60 个采样点,实时绘制使用率走势。




核心增强二:命令历史候选提示
长时间运维后,很多命令早已记在 shell 历史里,却总要靠 ↑ 翻找。本次改造为本地与远程终端都加上了命令历史候选提示:输入命令前缀时,下方自动弹出候选面板,回车即可补全。
实现分为两条线:
- 本地终端 :只读解析本地 shell 历史文件------
.bash_history(bash)、.zsh_history(zsh,含: 时间戳:耗时;扩展格式)、fish_history(fish 的 YAML 格式)、PowerShell 的ConsoleHost_history.txt。解析时做了去重、去时间戳前缀,最多索引 2 万行、返回 5 条候选。 - SSH 远程终端 :通过
SSHCommandSuggestionProvider读取远端 shell 的历史文件,同样做前缀匹配。
性能与安全上也做了专门处理:历史文件有变化(按 mtime 判断)才重新加载,冷启动预热后每 2 秒增量刷新一次,避免每次按键都卡在文件 IO;且只读不写 ------交互中输入的密码、交互式答案永远不会进入候选,杜绝泄露。

核心增强三:终端语义高亮
原版终端输出只有单调的前景色。这次通过一个规则引擎 semanticHighlighter.ts,在 xterm.js 前端对每一行输出做正则匹配,按优先级给不同语义上色:
| 语义类型 | 匹配示例 | 颜色 |
|---|---|---|
| 错误 | fatal、error、failed、denied |
红 |
| 警告 | warn、warning、deprecated |
黄 |
| 成功 | success、ready、running、ok |
绿 |
| 信息 | info、IP 地址(1.2.3.4) |
青 |
| 链接/路径 | https://...、/usr/local/bin、C:\... |
强调色 |
| 时间/调试 | 2024-01-01 12:00:00、debug、trace |
灰 |
规则按优先级排序、逐字占用避免重叠,并会自动剔除路径/链接末尾的标点符号。刷日志时,ERROR 会跳出来,路径和时间一眼可辨,排查效率提升明显。

核心增强四:远程目录同步
使用 SFTP 面板传输文件时,最烦的是面板目录和终端当前目录不一致。本次改造加入了远程目录同步 :终端 cd 到哪里,SFTP 面板就自动跟随到哪里。
实现原理很轻量------通过 remoteCWDIntegration.service.ts 探测远端 shell(bash/zsh),向 .bashrc 或 .zshrc 注入一段带标记的 PROMPT_COMMAND / precmd hook,通过 OSC 1337(\033]1337;CurrentDir=...)把当前工作目录上报回来。注入块用 # >>> Tabby CurrentDir v1 >>> 与 # <<< Tabby CurrentDir v1 <<< 包裹,可安全地重复写入或清除,文件写入采用「临时文件 + rename」的原子方式,避免损坏原有配置。
首次打开 SFTP 时,会弹窗询问是「仅本次启用」还是「永久写入配置」,用户可随时取消。

核心增强五:SSH 配置导入导出与分组管理
当主机数量多起来,配置管理就成了刚需。本次改造新增了SSH 配置的 CSV 导入导出,并把主机选择器改造成了带搜索、分组、折叠的分组管理界面。
CSV 导入导出 (profileTransfer.ts):
- 支持
主机名称、协议、主机地址、端口、用户名、认证方式、分组等字段; - 导出时密码、私钥、私钥密码走加密 Vault 存储,不落明文;
- 导入时自动按「主机地址 + 端口 + 用户名」去重,跳过已存在主机并统计跳过数;
- 分组列可自动创建多级分组(按路径
A/B/C建树)。
分组管理 (profileSelectorModal):
- 主机按分组树展示,支持折叠/展开(折叠状态持久化到本地);
- 顶部搜索框按名称、描述、分组路径、类型实时过滤;
- 独立的「最近使用」「全部主机」视图,以及快速连接入口。

界面优化:从细节打磨到窗口重构
除了功能,这次还系统性地重做了界面,让整体观感从「能用」走向「精致」。以下为本次界面优化的要点:
窗口与标题栏
- 弃用 Windows 原生 WCO(Window Controls Overlay)覆盖层,改用自绘
WindowControlsComponent,在thin/full框架模式下渲染统一的最小化/最大化/关闭按钮; - 窗口支持 8px 圆角(
rounded-window),最大化/全屏时自动切回直角,避免圆角遮挡。
标签页
- 标签由生硬的矩形改为圆角胶囊样式(7px 圆角),激活态用半透明前景色描边高亮,视觉层次更清晰;
- 标签默认宽度由 200px 收窄到 180px,同屏可容纳更多标签;
- 新增连接状态指示灯:绿点表示已连接、红点表示已断开,分屏标签也能继承聚焦子标签的状态;
- 支持
displayTitle自定义标题,与系统标题解耦。
滚动条
- 全局滚动条宽度由 10px 收窄到 5px,两端圆角,视觉更轻盈。
设置页响应式
- 引入 CSS
@container容器查询,设置表单在宽屏下左右排布、窄屏下自动竖排,适配不同窗口宽度。
文件传输面板
- 由原来的下拉菜单重构为居中悬浮面板 :半透明遮罩 + 毛玻璃(
backdrop-filter: blur(10px)),传输进行时按钮底部带一条流动的「跑马灯」动画(marching-ants),直观提示传输状态。
右键菜单
- 重构为独立的
ContextMenuService+ContextMenuComponent,菜单项按权重分组,低频项收进「More」子菜单,主菜单更清爽。
终端工具栏
- 优化
pointer-events,悬浮工具栏不再遮挡点击区域。
原版 vs 二开版功能对比
| 能力 | 原版 Tabby | 二开版 |
|---|---|---|
| SSH 服务器监控 | 无,需手动敲命令 | 右侧常驻面板,CPU/内存/磁盘/网络/总览,3s 刷新 |
| 命令历史补全 | 无 | 本地 4 类 shell + SSH 远程自动补全 |
| 语义高亮 | 无 | 错误/警告/成功/URL/路径/IP/时间着色 |
| 远程目录同步 | 需要在.bashrc中手动设置 | SFTP 跟随终端 cwd,自动注入 hook |
| 配置导入导出 | 无 CSV | CSV 导入导出,密码/私钥加密,分组映射 |
| 分组管理 | 平铺列表 | 分组树 + 搜索 + 折叠 + 最近使用 |
| 窗口标题栏 | 原生 WCO | 自绘控件 + 8px 圆角 |
| 标签页 | 矩形 200px | 圆角胶囊 180px + 连接状态灯 |