看看DomTerm,一个带有HTML图形和其他罕见功能的终端仿真器和多路复用器。
DomTerm是一个现代终端模拟器,它使用浏览器引擎作为“GUI工具包”。这支持许多相关功能,例如可嵌入图像和链接,HTML富文本和可折叠(显示/隐藏)命令。此外,它看起来像一个功能齐全的独立终端仿真器,具有出色的xterm兼容性(包括鼠标处理和24位颜色)和适当的“装饰”(菜单)。它还内置支持会话管理和侧窗(如tmux和GNU屏幕),基本输入编辑(如readline)和分页(如less)。
图1: DomTerminal终端仿真器。
图1: DomTerminal终端仿真器。
我们将在以下部分中介绍这些功能。我们假设您已经安装了domterm(如果您需要获取并构建Dormterm,请跳到本文末尾)。我们在开始之前先看看这项技术吧。
前端与后端
大多数DomTerm都是用JavaScript编写的,它在浏览器引擎中运行。它可以是桌面浏览器,如Chrome或Firefox(参见图3)或嵌入式浏览器。使用通用Web浏览器没有问题,但用户体验不够好(因为菜单用于一般的Web浏览而不是终端模拟器),并且其安全模型可能受到阻碍。因此使用嵌入式浏览器会更好。
目前支持以下内容:
Qdomterm,使用Qt工具包和QtWebEngine
嵌入式电子(见图1)
Atom-domterm以Atom文本编辑器(也基于Electron)的形式运行DomTerm,并与Atom面板系统集成(参见图2)。
JavaFX的WebEngine包装器,对Java编程非常有用(参见图4)。以前,Firefox-XUL首选作为前端,但Mozilla终止了XUL。
图2:Atom编辑器中的DomTerm终端面板。
图2: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(命令行)上很好,但它并不理想。以下是一些在终端仿真器中不常见的REPL最有用的DomTerm功能:一个“打印”图片,图形,数学公式或一组可点击链接的命令:该应用程序可以发送包含几乎任何HTML的转义字符。 (HTML将被删除以删除JavaScript和其他危险功能。)
图3显示了gnuplot会话中的片段。 Gnuplot(2.1或更高版本)支持DormTerm作为终端类型。图形输出转换为SVG图像,然后打印到终端。 DormTerm上我的博客文章中的Gnuplot节目提供了更多相关信息。
图3:Gnuplot截图。
图3:Gnuplot截图。
Kawa语言有一个库,可以创建和转换几何图像值。如果将此类图像值打印到DomTerm终端,图像将转换为SVG并嵌入输出中。
图4:Kawa中的可计算几何。
图4:Kawa中的可计算几何。
丰富的文本输出:HTML样式的帮助更容易阅读,看起来更漂亮。图1的下图显示了dormterm帮助的输出。 (如果未在DomTerm下运行,则输出正常文本。)请注意包含的寻呼机中的PAUSED消息。
包含可点击链接的错误消息:DomTerm识别语法文件名:行:列并将其转换为链接,该链接在可自定义的文本编辑器中打开文件并导航到该行。 (如果您使用PROMPT_COMMAND或类似的跟踪目录,这适用于相对路径文件名。)
编译器可以检测到它在DomTerm下运行并直接与转义字符发出文件链接。这比依赖于DomTerm的样式匹配更加健壮,因为它处理空格和其他字符,并且不依赖于目录跟踪。在图4中,您可以看到来自Kawa Compiler的错误消息。将鼠标悬停在文件位置会使其加下划线,文件: URL将显示在atom-domterm消息栏(窗口底部)中。 (当不使用atom-domterm时,这样的消息将显示在浮动图层框中,如图1中的PAUSED消息所示。)
单击链接时的操作是可配置的。默认情况下,带有#position后缀的文件:链接的操作是在文本编辑器中打开该文件。结构化内部表示:以下内容均由内部节点结构表示:命令,提示,输入行,正常和错误输出,标签,如果“另存为HTML”,则保留结构。 HTML文件与XML兼容,因此您可以使用XML工具来搜索或转换输出。命令domterm view-saved以启用命令折叠(显示/隐藏按钮处于活动状态)和调整窗口大小的方式打开保存的HTML文件。
内置Lisp样式打印优雅:您可以在输出中包含漂亮的打印指令(如分组),以便根据窗口大小调整重新计算换行符。查看我的文章在DomTerm中进行动态和漂亮的打印,以获得更深入的外观。
基本的内置行编辑,具有历史记录(如GNU readline):这使用浏览器自己的编辑器,因此它具有出色的鼠标和选择处理机制。您可以处于正常字符模式(输入的大多数字符都参考该过程);或行模式(直接插入普通字符,而控制字符导致编辑操作,输入键将编辑后的行发送到进程)之间进行转换。默认为自动模式,根据PTY处于原始模式还是终端模式,DomTerm在字符模式和行模式之间进行转换。
自包含的寻呼机(比较简化的简化版):键盘快捷键控制滚动。在“页面模式”中,输出在每个新屏幕上暂停(如果您想逐行前进,则输出一个单独的行);页面模式对于用户输入而言简单且智能,因此(如果需要)您不需要阻止交互式程序来运行它。
多路复用和会话
标签和图块:您不仅可以创建多个终端标签,还可以平铺它们。您可以使用鼠标或键盘快捷键创建或切换面板和标签。可以使用鼠标重新排列和调整大小。这是通过GoldenLayout JavaScript库完成的。图1显示了一个带有两个面板的窗口。上面有两个标签,一个是Midnight Commander;底部面板显示HTML中的dormterm帮助输出。相比之下,在Atom中我们使用自己的可拖动面板和标签。您可以在图2中看到这一点。
分离或重新连接会话:与tmux和GNU屏幕类似,DomTerm支持会话调度。您甚至可以将多个窗口或面板连接到同一会话。这支持多用户会话共享和远程链接。 (为了安全起见,同一服务器上的所有会话都需要能够读取Unix域接口和包含随机密钥的本地文件。当我们拥有良好,安全的远程链接时,这个限制将被放宽。)domterm命令类似于tmux和GNU屏幕,它有多个选项用于控制或打开单个或多个会话的服务器。主要区别在于,如果它没有在DomTerm下运行,则dormterm命令会创建一个新的顶级窗口,而不是在现有终端中运行。
与tmux和git一样,dormterm命令有许多子命令。一些子命令创建窗口或会话。其他(例如“打印”图片)仅在现有的DormTerm会话下工作。
命令domterm browse打开一个窗口或面板以浏览指定的URL,例如浏览文档时。
获取并安装DomTerm
DomTerm可从其Github存储库获得。目前没有提前构建的软件包,但有详细的说明。所有先决条件都可以在Fedora 27上使用,这使得构建起来特别容易。