Windows TerminalWindows 全新終端
Windows Terminal 是一個(gè)全新的、流行的、功能強(qiáng)大的命令行終端工具。包含很多來(lái)社區(qū)呼聲很高的特性,例如:多 Tab 支持、富文本、多語(yǔ)言支持、可配置、主題和樣式,支持 emoji 和基于 GPU 運(yùn)算的文本渲染等等。同時(shí)該終端依然符合我們的目標(biāo)和要求,以確保它保持快速、高效,并且不會(huì)消耗大量?jī)?nèi)存和電源。
Windows 控制臺(tái)主機(jī)
Windows 控制臺(tái)主機(jī)程序 conhost.exe是 Windows 原生的命令行體驗(yàn),它實(shí)現(xiàn)了 Windows 的命令行基礎(chǔ)架構(gòu),同時(shí)提供 Windows Console API,輸入引擎、渲染引擎和用戶配置信息。本項(xiàng)目中的控制臺(tái)主機(jī)代碼實(shí)際上是 Windows 中的 conhost.exe 的源碼。
控制臺(tái)的主要目的是對(duì)已有控制臺(tái)應(yīng)用保持向后兼容性。自從 2014 年有了 Windows 命令行以來(lái),開發(fā)團(tuán)隊(duì)已經(jīng)給控制臺(tái)增加了很多新特性,包括窗口透明化、基于行的選擇以及支持 ANSI / 虛擬終端序列 Virtual Terminal sequences, 24-bit color, 以及一個(gè) Pseudoconsole ("ConPTY") 等等。
但是由于控制臺(tái)主要的目標(biāo)是維護(hù)向后兼容性,所以盡管這么多年社區(qū)一直希望我們能添加一些特性(例如 Tabs),但是我們不可能再增加這些特性。諸多限制讓我們決定開發(fā)一個(gè)全新的 Windows Terminal。
本項(xiàng)目包含:
- Windows Terminal
- Windows Terminal Preview
- Windows 控制臺(tái)主機(jī) (
conhost.exe) - 上述兩項(xiàng)目的共享組件
- ColorTool
- 示例項(xiàng)目 將展示如何使用 Windows Console APIs
共享的組件
在對(duì)控制臺(tái)進(jìn)行大修的同時(shí),我們對(duì)其代碼庫(kù)進(jìn)行了大量的改進(jìn)。主要是將邏輯實(shí)體清晰地劃分為模塊和類,引入了一些關(guān)鍵的擴(kuò)展點(diǎn),用更安全、更高效的STL容器替換了幾個(gè)舊的、自制的集合和容器,并通過(guò)使用微軟的 Wil header 庫(kù)使代碼更簡(jiǎn)單、更安全。
這項(xiàng)大修工作導(dǎo)致創(chuàng)建了幾個(gè)對(duì) Windows 上的任何終端實(shí)現(xiàn)都有用的關(guān)鍵組件,包括一個(gè)新的基于 DirectWrite 的文本布局和渲染引擎、一個(gè)能夠存儲(chǔ) UTF-16 和 UTF-8 的文本緩沖區(qū)以及一個(gè)VT解析器/發(fā)射器。
構(gòu)建一個(gè)全新終端
當(dāng)開始構(gòu)建全新終端應(yīng)用程序時(shí),我們探索并評(píng)估了幾種方法和技術(shù)堆棧。最終決定繼續(xù)使用 C++ 開發(fā),并通過(guò)共享上述的現(xiàn)代化組件來(lái)實(shí)現(xiàn)我們的目標(biāo),并基于現(xiàn)代 Windows 應(yīng)用程序平臺(tái)和 UI 框架之上進(jìn)行開發(fā)。
此外,我們意識(shí)到終端的渲染器和輸入堆棧可以構(gòu)建成可重用的 Windows UI 控件,方便其他人可以將其合并到其他應(yīng)用程序中。
源碼構(gòu)建
該項(xiàng)目使用 git submodules 包含一些相關(guān)依賴,要確保子模塊被更新,請(qǐng)?jiān)跇?gòu)建器使用如下命令檢查:
git submodule update --init --recursive
OpenConsole.sln 需要在 Visual Studio 構(gòu)建或者是使用 MSBuild 在命令行中構(gòu)建。命令行構(gòu)建的方法如下:
nuget restore OpenConsole.sln msbuild OpenConsole.sln
我們還在 tools 目錄下提供了一組常用的腳本可以幫助自動(dòng)化處理構(gòu)建和運(yùn)行測(cè)試的過(guò)程。
