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