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

opensource.com
下面我们将更详细地了解这些功能。 我们假设您已安装 domterm
(如果您需要获取和构建 DomTerm,请跳到本文末尾)。 不过,首先,这里对这项技术进行快速概述。
前端 vs. 后端
DomTerm 的大部分是用 JavaScript 编写的,并在浏览器引擎中运行。 这可以是桌面 Web 浏览器,例如 Chrome 或 Firefox(参见图 3),也可以是嵌入式浏览器。 使用通用的 Web 浏览器效果很好,但用户体验不太好(因为菜单是为通用浏览而设计的,而不是为终端模拟器设计的),并且安全模型会妨碍,因此使用嵌入式浏览器会更好。
目前支持以下前端
qtdomterm
,它使用 Qt 工具包和QtWebEngine
Electron
嵌入(参见图 1)atom-domterm
将 DomTerm 作为软件包在 Atom 文本编辑器 中运行(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+Click 强制执行。)
使用 CSS 设置终端样式: 这通常在 ~/.domterm/settings.ini
中完成,该文件在保存时会自动重新加载。 例如,在图 2中,设置了特定于终端的背景颜色。
更好的 REPL 控制台
经典的终端模拟器在字符单元的矩形网格上工作。 这适用于 REPL(命令 shell),但并非理想。 以下是一些 DomTerm 功能,这些功能对于 REPL 非常有用,但在终端模拟器中通常找不到
命令可以“打印”图像、图形、数学公式或一组可单击的链接: 应用程序可以发送包含几乎任何 HTML 的转义序列。 (HTML 经过清理,以删除 JavaScript 和其他危险功能。)
图 3 显示了 gnuplot
会话的片段。 Gnuplot(2.1 或更高版本)支持 domterm
作为终端类型。 图形输出将转换为 SVG 图像,然后打印到终端。 我的博文 Gnuplot 在 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;底部窗格以 HTML 形式显示 domterm help
输出。 但是,在 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 条评论