DomTerm:一款為 Linux 打造的終端模擬器

Per Bothner發表於2019-05-06

瞭解一下 DomTerm,這是一款終端模擬器和複用器,帶有 HTML 圖形和其它不多見的功能。

DomTerm 是一款現代化的終端模擬器,它使用瀏覽器引擎作為 “GUI 工具包”。這就支援了一些相關的特性,例如可嵌入影像和連結、HTML 富文字以及可摺疊(顯示/隱藏)命令。除此以外,它看起來感覺就像一個功能完整、獨立的終端模擬器,有著出色 xterm 相容性(包括滑鼠處理和 24 位色)和恰當的 “裝飾” (選單)。另外它內建支援了會話管理和副視窗(如同 tmuxGNU Screen 中一樣)、基本輸入編輯(如在 readline 中)以及分頁(如在 less 中)。

圖 1: DomTerminal 終端模擬器。

在以下部分我們將看一看這些特性。我們將假設你已經安裝好了 domterm (如果你需要獲取並構建 Dormterm 請跳到本文最後)。開始之前先讓我們概覽一下這項技術。

前端 vs. 後端

DomTerm 大部分是用 JavaScript 寫的,它執行在一個瀏覽器引擎中。它可以是像例如 Chrome 或者 Firefox 一樣的桌面瀏覽器(見圖 3),也可以是一個內嵌的瀏覽器。使用一個通用的網頁瀏覽器沒有問題,但是使用者體驗卻不夠好(因為選單是為通用的網頁瀏覽而不是為了終端模擬器所打造),並且其安全模型也會妨礙使用。因此使用內嵌的瀏覽器更好一些。

目前以下這些是支援的:

  • qdomterm,使用了 Qt 工具包 和 QtWebEngine
  • 一個內嵌的 Electron(見圖 1)
  • atom-domterm 以 Atom 文字編輯器(同樣基於 Electron)包的形式執行 DomTerm,並和 Atom 皮膚系統整合在一起(見圖 2)
  • 一個為 JavaFX 的 WebEngine 包裝器,這對 Java 程式設計十分有用(見圖 4)
  • 之前前端使用 Firefox-XUL 作為首選,但是 Mozilla 已經終止了 XUL

在 Atom 編輯器中的 DomTerm 終端皮膚

圖 2:在 Atom 編輯器中的 DomTerm 終端皮膚。

目前,Electron 前端可能是最佳選擇,緊隨其後的是 Qt 前端。如果你使用 Atom,atom-domterm 也工作得相當不錯。

後端伺服器是用 C 寫的。它管理著偽終端(PTY)和會話。它同樣也是一個為前端提供 Javascript 和其它檔案的 HTTP 伺服器。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 截圖。

Kawa 語言有一個建立並轉換幾何影像值的庫。如果你將這樣的圖片值列印到 DomTerm 終端,圖片就會被轉換成 SVG 形式並嵌入進輸出中。

圖 4:Kawa 中可計算的幾何形狀。

富文字輸出: 有著 HTML 樣式的幫助資訊更加便於閱讀,看上去也更漂亮。圖片 1 的下面皮膚展示 dormterm help 的輸出。(如果沒在 DomTerm 下執行的話輸出的是普通文字。)注意自帶的分頁器中的 PAUSED 訊息。

包括可點選連結的錯誤訊息: DomTerm 可以識別語法 filename:line:column 並將其轉化成一個能在可定製文字編輯器中開啟檔案並定位到行的連結。(這適用於相對路徑的檔名,如果你用 PROMPT_COMMAND 或類似的跟蹤目錄。)

編譯器可以偵測到它在 DomTerm 下執行,並直接用轉義字元發出檔案連結。這比依賴 DomTerm 的樣式匹配要穩健得多,因為它可以處理空格和其他字元並且無需依賴目錄追蹤。在圖 4 中,你可以看到來自 Kawa Compiler 的錯誤訊息。懸停在檔案位置上會使其出現下劃線,file: URL 出現在 atom-domterm 訊息欄(視窗底部)中。(當不用 atom-domterm 時,這樣的訊息會在一個浮層的框中顯示,如圖 1 中所看到的 PAUSED 訊息所示。)

點選連結時的動作是可以配置的。預設對於帶有 #position 字尾的 file: 連結的動作是在文字編輯器中開啟那個檔案。

結構化內部表示:以下內容均以內部節點結構表示:命令、提示符、輸入行、正常和錯誤輸出、標籤,如果“另存為 HTML”,則保留結構。HTML 檔案與 XML 相容,因此你可以使用 XML 工具搜尋或轉換輸出。命令 domterm view-saved 會以一種啟用命令摺疊(顯示/隱藏按鈕處於活動狀態)和重新調整視窗大小的方式開啟儲存的 HTML 檔案。

內建的 Lisp 樣式優美列印: 你可以在輸出中包括優美列印指令(比如,grouping),這樣斷行會根據視窗大小調整而重新計算。檢視我的文章 DomTerm 中的動態優美列印以更深入探討。

基本的內建行編輯,帶著歷史記錄(像 GNU readline 一樣): 這使用瀏覽器自帶的編輯器,因此它有著優秀的滑鼠和選擇處理機制。你可以在正常字元模式(大多數輸入的字元被指接送向程式);或者行模式(通常的字元是直接插入的,而控制字元導致編輯操作,Enter鍵會向程式傳送被編輯行)之間轉換。預設的是自動模式,根據 PTY 是在原始模式還是終端模式中,DomTerm 在字元模式與行模式間轉換。

自帶的分頁器(類似簡化版的 less):鍵盤快捷鍵控制滾動。在“頁模式”中,輸出在每個新的螢幕(或者單獨的行,如果你想一行行地向前移)後暫停;頁模式對於使用者輸入簡單智慧,因此(如果你想的話)你無需阻礙互動式程式就可以執行它。

多路複用和會話

標籤和平鋪: 你不僅可以建立多個終端標籤,也可以平鋪它們。你可以要麼使用滑鼠或鍵盤快捷鍵來建立或者切換皮膚和標籤。它們可以用滑鼠重新排列並調整大小。這是通過 GoldenLayout JavaScript 庫實現的。圖 1 展示了一個有著兩個皮膚的視窗。上面的有兩個標籤,一個執行 Midnight Commander;底下的皮膚以 HTML 形式展示了 dormterm help 輸出。然而相反在 Atom 中我們使用其自帶的可拖拽的皮膚和標籤。你可以在圖 2 中看到這個。

分離或重接會話:tmux 和 GNU screen 類似,DomTerm 支援會話安排。你甚至可以給同樣的會話接上多個視窗或皮膚。這支援多使用者會話分享和遠端連結。(為了安全,同一個伺服器的所有會話都需要能夠讀取 Unix 域介面和一個包含隨機金鑰的本地檔案。當我們有了良好、安全的遠端連結,這個限制將會有所放鬆。)

domterm 命令 類似與 tmux 和 GNU screen,它有多個選項可以用於控制或者開啟單個或多個會話的伺服器。主要的差別在於,如果它沒在 DomTerm 下執行,dormterm 命令會建立一個新的頂層視窗,而不是在現有的終端中執行。

tmuxgit 類似,dormterm 命令有許多子命令。一些子命令建立視窗或者會話。另一些(例如“列印”一張圖片)僅在現有的 DormTerm 會話下起作用。

命令 domterm browse 開啟一個視窗或者皮膚以瀏覽一個指定的 URL,例如瀏覽文件的時候。

獲取並安裝 DomTerm

DomTerm 可以從其 Github 倉庫獲取。目前沒有提前構建好的包,但是有詳細指導。所有的前提條件在 Fedora 27 上都有,這使得其特別容易被搭建。


via: https://opensource.com/article/18/1/introduction-domterm-terminal-emulator

作者:Per Bothner 譯者:tomjlw 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章