蚊章汇 - Per Bothner
type: channel
link: https://linuxcn.bwsl.wang/author/1229/
description: Per Bothner
items: DomTerm：一款为 Linux 打造的终端模拟器

DomTerm：一款为 Linux 打造的终端模拟器
type: item
date: 2019-05-06T17:12:52+08:00
description: 了解一下 DomTerm，这是一款终端模拟器和复用器，带有 HTML 图形和其它不多见的功能。DomTerm 是一款现代化的终端模拟器，它使用浏览器引擎作为 “GUI 工具包”。这就支持了一些相关的特性，例如可嵌入图像和链接、HTML 富文本以及可折叠（显示/隐藏）命令。除此以外，它看起来感觉就像一个功能完整、独立的终端模拟器，有着出色 xterm 兼容性（包括鼠标处理和 24 位色）和恰当的 “装饰” （菜单）。另外它内置支持了会话管理和副窗口（如同 tmux 和 GNU Screen 中一样）、基本输入编辑（如在 readline 中）以及分页（如在 less 中）。图 1: DomTerminal 终端模拟器。在以下部分我们将看一看这些特性。我们将假设你已经安装好了 domterm （如果你需要获取并构建 Dormterm 请跳到本文最后）。开始之前先让我们概览一下这项技术。前端 vs. 后端DomTerm 大部分是用 JavaScript 写的，它运行在一个浏览器引擎中。它可以是像例如 Chrome 或者 Firefox 一样的桌面浏览器（见图 3），也可以是一个内嵌的浏览器。使用一个通用的网页浏览器没有问题，但是用户体验却不够好（因为菜单是为通用的网页浏览而不是为了终端模拟器所打造)，并且其安全模型也会妨碍使用。因此使用内嵌的浏览器更好一些。目前以下这些是支持的：qdomterm，使用了 Qt 工具包 和 QtWebEngine一个内嵌的 Electron（见图 1）atom-domterm 以 Atom 文本编辑器（同样基于 Electron）包的形式运行 DomTerm，并和 Atom 面板系统集成在一起（见图 2）一个为 JavaFX 的 WebEngine 包装器，这对 Java 编程十分有用（见图 4）之前前端使用 Firefox-XUL 作为首选，但是 Mozilla 已经终止了 XUL图 2：在 Atom 编辑器中的 DomTerm 终端面板。目前，Electron 前端可能是最佳选择，紧随其后的是 Qt 前端。如果你使用 Atom，atom-domterm 也工作得相当不错。后端服务器是用 C 写的。它管理着伪终端（PTY）和会话。它同样也是一个为前端提供 Javascript 和其它文件的 HTTP 服务器。domterm 命令启动终端任务和执行其它请求。如果没有服务器在运行，domterm 就会自己来服务。后端与服务器之间的通讯通常是用 WebSockets（在服务器端是libwebsockets）完成的。然而，JavaFX 的嵌入既不用 Websockets 也不用 DomTerm 服务器。相反 Java 应用直接通过 Java-Javascript 桥接进行通讯。一个稳健的可兼容 xterm 的终端模拟器DomTerm 看上去感觉像一个现代的终端模拟器。它处理鼠标事件、24 位色、Unicode、倍宽字符（CJK）以及输入方式。DomTerm 在 vttest 测试套件 上工作地十分出色。其不同寻常的特性包括：展示/隐藏按钮（“折叠”）： 小三角（如上图 2）是隐藏/展示相应输出的按钮。仅需在提示符中添加特定的转义字符就可以创建按钮。对于 readline 和类似输入编辑器的鼠标点击支持： 如果你点击输入区域（黄色），DomTerm 会向应用发送正确的方向键按键序列。（可以通过提示符中的转义字符启用这一特性，你也可以通过 Alt+点击 强制使用。）用 CSS 样式化终端： 这通常是在 ~/.domterm/settings.ini 里完成的，保存时会自动重载。例如在图 2 中，设置了终端专用的背景色。一个更好的 REPL 控制台一个经典的终端模拟器基于长方形的字符单元格工作的。这在 REPL（命令行）上没问题，但是并不理想。这里有些通常在终端模拟器中不常见的 REPL 很有用的 DomTerm 特性：一个能“打印”图片、图形、数学公式或者一组可点击的链接的命令： 应用可以发送包含几乎任何 HTML 的转义字符。（HTML 会被剔除部分，以移除 JavaScript 和其它危险特性。）图 3 显示了来自 gnuplot 会话的一个片段。Gnuplot（2.1 或者跟高版本）支持 DormTerm 作为终端类型。图形输出被转换成 SVG 图片，然后被打印到终端。我的博客帖子在 DormTerm 上的 Gnuplot 展示在这方面提供了更多信息。图 3：Gnuplot 截图。Kawa 语言有一个创建并转换几何图像值的库。如果你将这样的图片值打印到 DomTerm 终端，图片就会被转换成 SVG 形式并嵌入进输出中。图 4：Kawa 中可计算的几何形状。富文本输出： 有着 HTML 样式的帮助信息更加…