DomTerm 是一款现代终端模拟器,它使用浏览器引擎作为“GUI 工具包”。这实现了一些巧妙的功能,例如可嵌入的图形和链接、HTML 富文本以及可折叠(显示/隐藏)的命令。 除此之外,它的外观和感觉都像一个功能齐全的独立终端模拟器,具有出色的 xterm 兼容性(包括鼠标处理和 24 位颜色)以及合适的“chrome”(菜单)。 此外,它还内置支持会话管理和子窗口(如 tmux
和 GNU screen
)、基本输入编辑(如 readline
)和分页(如 less
)。

opensource.com
下面我们将更详细地了解这些功能。 我们假设您已安装 domterm
(如果您需要获取和构建 DomTerm,请跳至本文末尾)。 不过,首先,让我们快速概述一下这项技术。
前端与后端
DomTerm 的大部分是用 JavaScript 编写的,并在浏览器引擎中运行。 这可以是桌面 Web 浏览器,例如 Chrome 或 Firefox(请参见图片 3),也可以是嵌入式浏览器。 使用通用 Web 浏览器也可以,但用户体验不太好(因为菜单是为通用浏览设计的,而不是为终端模拟器设计的),并且安全模型会妨碍使用,因此使用嵌入式浏览器更好。
目前支持以下前端:
qtdomterm
,它使用 Qt 工具包和QtWebEngine
- 一个
Electron
嵌入(请参见图片 1) atom-domterm
将 DomTerm 作为 Atom 文本编辑器(它也基于 Electron)中的一个软件包运行,并与 Atom 面板系统集成(请参见图片 2)- JavaFX 的
WebEngine
包装器,这对于用 Java 编写的代码很有用(请参见图片 4) - 以前,首选的前端使用 Firefox-XUL,但 Mozilla 之后放弃了 XUL

图片 1:Atom 编辑器中的 DomTerm 终端面板
目前,Electron 前端可能是最好的选择,其次是 Qt 前端。 如果您使用 Atom,atom-domterm
也运行良好。
后端服务器是用 C 语言编写的。 它管理伪终端 (PTY) 和会话。 它也是一个 HTTP 服务器,向前端提供 JavaScript 和其他文件。 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(命令 shell),但并非理想。 以下是一些 DomTerm 功能,这些功能对于 REPL 非常有用,但在终端模拟器中通常找不到:
命令可以“打印”图像、图形、数学公式或一组可单击的链接: 应用程序可以发送包含几乎任何 HTML 的转义序列。 (HTML 经过清理以删除 JavaScript 和其他危险功能。)
图片 3 显示了 gnuplot
会话的片段。 Gnuplot(2.1 或更高版本)支持 domterm
作为终端类型。 图形输出转换为 SVG 图像,然后打印到终端。 我的博客文章 Gnuplot display on DomTerm 提供了有关此内容的更多信息。

图片 3:Gnuplot 屏幕截图
Kawa 语言有一个库,用于创建和转换几何图形值。 如果您将这样的图形值打印到 DomTerm 终端,则该图形将转换为 SVG 并嵌入到输出中。

图片 4:Kawa 中的可计算几何图形
输出中的富文本: 帮助消息通过 HTML 样式变得更具可读性并且看起来更好。 图片 1 的下方面板显示了 domterm help
的输出。 (如果不在 DomTerm 下运行,则输出为纯文本。) 请注意来自内置分页器的 PAUSED
消息。
错误消息可以包含可单击的链接: DomTerm 识别语法 filename:line:column:
并将其转换为链接,该链接会在可配置的文本编辑器中打开文件和行。 (如果您使用 PROMPT_COMMAND
或类似命令来跟踪目录,则这适用于相对文件名。)
编译器可以检测到它正在 DomTerm 下运行,并直接在转义序列中发出文件链接。 这比依赖 DomTerm 的模式匹配更可靠,因为它处理空格和其他特殊字符,并且不依赖于目录跟踪。 在图片 4中,您可以看到来自 Kawa 编译器的错误消息。 将鼠标悬停在文件位置上会导致其带有下划线,并且 file:
URL 显示在 atom-domterm
消息区域中(窗口底部)。 (当不使用 atom-domterm
时,此类消息会显示在叠加框中,如图片 1中 PAUSED
消息所示。)
单击链接时的操作是可配置的。 带有 #position
后缀的 file:
链接的默认操作是在文本编辑器中打开文件。
结构化内部表示: 以下内容都以内部节点结构表示:命令、提示符、输入行、正常输出和错误输出、选项卡,以及如果您“另存为 HTML”,则保留结构。 HTML 文件与 XML 兼容,因此您可以使用 XML 工具搜索或转换输出。 命令 domterm view-saved
以启用命令折叠的方式打开保存的 HTML 文件(显示/隐藏按钮处于活动状态)以及在窗口大小调整时重新排列。
内置 Lisp 风格的漂亮打印: 您可以在输出中包含漂亮打印指令(例如,分组),以便在线路中断时在窗口大小调整时重新计算。 有关更深入的讨论,请参阅我的文章 DomTerm 中的动态漂亮打印。
基本的内置行编辑,带有历史记录(如 GNU readline
): 这使用浏览器的内置编辑器,因此它具有出色的鼠标和选择处理。 您可以在正常字符模式(键入的大多数字符直接发送到进程);或行模式(常规字符插入,而控制字符导致编辑操作,Enter 键将编辑后的行发送到进程)之间切换。 默认设置为自动模式,其中 DomTerm 根据 PTY 是否处于raw
或canonical
模式在字符模式和行模式之间切换。
内置分页器(如简化的 less
): 键盘快捷键将控制滚动。 在“分页模式”下,输出在每个新屏幕后暂停(如果您逐行前进,则在单行后暂停)。 分页模式不引人注目且对用户输入很智能,因此您可以(如果您愿意)在不干扰交互式程序的情况下运行它。
多路复用和会话
选项卡和平铺: 您不仅可以创建多个终端选项卡,还可以平铺它们。 您可以使用鼠标或键盘快捷键在面板和选项卡之间移动,以及创建新的面板和选项卡。 它们可以使用鼠标重新排列和调整大小。 这是使用 GoldenLayout JavaScript 库实现的。 图片 1 显示了一个包含两个面板的窗口。 顶部面板有两个选项卡,其中一个运行 Midnight Commander; 底部面板显示 domterm help
输出为 HTML。 但是,在 Atom 上,我们改为使用其内置的可拖动平铺和选项卡; 您可以在图片 2中看到这一点。
分离和重新连接到会话: DomTerm 支持会话安排,类似于 tmux
和 GNU screen
。 您甚至可以将多个窗口或面板附加到同一会话。 这支持多用户会话共享和远程连接。 (出于安全考虑,同一服务器的所有会话都需要能够读取 Unix 域套接字和一个包含随机密钥的本地文件。 当我们有一个良好、安全的远程访问方案时,此限制将被解除。)
domterm
命令 也类似于 tmux
或 GNU screen
,因为它具有用于控制或启动管理一个或多个会话的服务器的多个选项。 主要区别在于,如果它尚未在 DomTerm 下运行,则 domterm
命令会创建一个新的顶级窗口,而不是在现有终端中运行。
domterm
命令有许多子命令,类似于 tmux
或 git
。 一些子命令创建窗口或会话。 其他子命令(例如“打印”图像)仅在现有 DomTerm 会话中有效。
命令 domterm browse
打开一个窗口或面板以浏览指定的 URL,例如在浏览文档时。
获取和安装 DomTerm
DomTerm 可从其 GitHub 存储库 获得。 目前,没有预构建的软件包,但有详细说明。 所有先决条件在 Fedora 27 上都可用,这使得构建特别容易。
3 条评论