DomTerm 终端模拟器简介,适用于 Linux

了解 DomTerm,一款具有 HTML 图形和其他不寻常功能的终端模拟器和多路复用器。
316 位读者喜欢这个。
Terminal view

Jamie Cox。由 Opensource.com 修改。CC BY 2.0。

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

DomTerminal terminal emulator

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

DomTerm terminal panes in Atom editor

图片 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 图像,然后打印到终端。 我的博客文章在 DomTerm 上显示 Gnuplot 提供了有关此内容的更多信息。

Image 3: Gnuplot screenshot

图片 3:Gnuplot 屏幕截图

 

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

Image 4: Computable geometry in Kawa

图片 4:Kawa 中的可计算几何图形

 

输出中的富文本: 帮助消息通过 HTML 样式更具可读性并且看起来更好。 图片 1 的下部窗格显示了 domterm help 的输出。 (如果不在 DomTerm 下运行,则输出为纯文本。)请注意来自内置分页器的 PAUSED 消息。

错误消息可以包含可单击的链接: DomTerm 识别语法 文件名:行号:列号: 并将其转换为链接,该链接在可配置的文本编辑器中打开文件和行。 (如果您使用 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 命令有许多子命令,类似于 tmuxgit。 一些子命令创建窗口或会话。 其他子命令(例如“打印”图像)仅在现有 DomTerm 会话中有效。

命令 domterm browse 打开一个窗口或窗格以浏览指定的 URL,例如浏览文档时。

获取和安装 DomTerm

DomTerm 可从其 GitHub 仓库 获取。 目前,没有预构建的软件包,但有详细说明。 所有先决条件在 Fedora 27 上都可用,这使得构建特别容易。

标签
Per Bothner
Per 自开源术语出现之前就参与了开源。 他是 Cygnus(后来被 Red Hat 收购)的早期员工,Cygnus 是第一家将自由软件商业化的公司。 他在那里从事 gcc、g++、libio(GNU/Linux stdio 的前身)、gdb、Kawa 等方面的工作。 后来他在 Sun 和 Oracle 的 Java 组工作。 Per 编写了 Emacs term 模式。

3 条评论

有没有办法在 Win7 上构建这个?

我还没有尝试过。 我预见到 pty 处理将是最大的问题。 使用 MinGW 或 CygWin 可能是可行的。 Windows 7 的优先级较低,但我希望让 Windows 10 支持工作起来。 使用适用于 Linux 的 Windows 子系统应该更容易。

我最近创建了 Theia IDE 的一个分支(参见 https://github.com/PerBothner/theia),使用 DomTerm 作为终端模拟器。 该分支使用节点 pty 支持,我相信这应该可以在 Windows 上工作,尽管我没有测试过。

回复 ,作者:dpkshetty

我已经成功将 DomTerm 移植到 WSL(适用于 Linux 的 Windows 子系统)。 (这当然仅适用于 Windows 10。)这效果很好,尽管唯一经过测试/可用的前端是 Win32 Firefox 浏览器。 构建说明在 DomTerm 主页上。

回复 ,作者:Per_Bothner

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.