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,请跳到本文末尾)。 不过,首先,这里对这项技术进行快速概述。

前端 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

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+Click 强制执行。)

使用 CSS 设置终端样式: 这通常在 ~/.domterm/settings.ini 中完成,该文件在保存时会自动重新加载。 例如,在图 2中,设置了特定于终端的背景颜色。

更好的 REPL 控制台

经典的终端模拟器在字符单元的矩形网格上工作。 这适用于 REPL(命令 shell),但并非理想。 以下是一些 DomTerm 功能,这些功能对于 REPL 非常有用,但在终端模拟器中通常找不到

命令可以“打印”图像、图形、数学公式或一组可单击的链接: 应用程序可以发送包含几乎任何 HTML 的转义序列。 (HTML 经过清理,以删除 JavaScript 和其他危险功能。)

图 3 显示了 gnuplot 会话的片段。 Gnuplot(2.1 或更高版本)支持 domterm 作为终端类型。 图形输出将转换为 SVG 图像,然后打印到终端。 我的博文 Gnuplot 在 DomTerm 上的显示 提供了有关此内容的更多信息。

Image 3: Gnuplot screenshot

图 3:Gnuplot 屏幕截图

 

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

Image 4: Computable geometry in Kawa

图 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 是否处于rawcanonical模式在字符模式和行模式之间切换。

内置分页器(类似于简化的 less): 键盘快捷键将控制滚动。 在“分页模式”下,输出在每个新屏幕(或单行,如果您逐行前进)后暂停。 分页模式不引人注目且对用户输入很智能,因此您可以(如果需要)在不干扰交互式程序的情况下运行它。

多路复用和会话

选项卡和平铺: 您不仅可以创建多个终端选项卡,还可以平铺它们。 您可以使用鼠标或键盘快捷键在窗格和选项卡之间移动,以及创建新的窗格和选项卡。 它们可以用鼠标重新排列和调整大小。 这是使用 GoldenLayout JavaScript 库实现的。 图 1 显示了一个带有两个窗格的窗口。 顶部窗格有两个选项卡,其中一个选项卡运行 Midnight Commander;底部窗格以 HTML 形式显示 domterm help 输出。 但是,在 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 支持工作起来。 使用 Windows Subsystem for Linux 应该会更容易。

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

回复 ,作者 dpkshetty

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

回复 ,作者 Per_Bothner

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