走近Windows Terminal:史上最强大的命令行控制台
Windows Terminal 是一个全新的、流行的、功能强大的命令行终端工具。包含很多来社区呼声很高的特性,例如:多 Tab 支持、富文本、多语言支持、可配置、主题和样式,支持 emoji 和基于 GPU 运算的文本渲染等等。同时该终端依然符合我们的目标和要求,以确保它保持快速、高效,并且不会消耗大量内存和电源。
Windows 控制台主机
Windows 控制台主机程序 conhost.exe是 Windows 原生的命令行体验,它实现了 Windows 的命令行基础架构,同时提供 Windows Console API, 输入引擎、渲染引擎和用户配置信息。本项目中的控制台主机代码实际上是 Windows 中的 conhost.exe 的源码。
控制台的主要目的是对已有控制台应用保持向后兼容性。
自从 2014 年有了 Windows 命令行以来,开发团队已经给控制台增加了很多新特性,包括窗口透明化、基于行的选择以及支持 ANSI / 虚拟终端序列 Virtual Terminal sequences, 24-bit color, 以及一个 Pseudoconsole ("ConPTY") 等等。
但是由于控制台主要的目标是维护向后兼容性,所以尽管这么多年社区一直希望我们能添加一些特性(例如 Tabs),但是我们不可能再增加这些特性。
诸多限制让我们决定开发一个全新的 Windows Terminal。
共享的组件
在对控制台进行大修的同时,我们对其代码库进行了大量的改进。主要是将逻辑实体清晰地划分为模块和类,引入了一些关键的扩展点,用更安全、更高效的STL容器替换了几个旧的、自制的集合和容器,并通过使用微软的 Wil header 库使代码更简单、更安全。
这项大修工作导致创建了几个对 Windows 上的任何终端实现都有用的关键组件,包括一个新的基于 DirectWrite 的文本布局和渲染引擎、一个能够存储 UTF-16 和 UTF-8 的文本缓冲区以及一个VT解析器/发射器。
构建一个全新终端
当开始构建全新终端应用程序时,我们探索并评估了几种方法和技术堆栈。最终决定继续使用 C++ 开发,并通过共享上述的现代化组件来实现我们的目标,并基于现代 Windows 应用程序平台和 UI 框架之上进行开发。
此外,我们意识到终端的渲染器和输入堆栈可以构建成可重用的 Windows UI 控件,方便其他人可以将其合并到其他应用程序中。
源码构建
该项目使用 git submodules 包含一些相关依赖,要确保子模块被更新,请在构建器使用如下命令检查:
git submodule update--init --recursive
OpenConsole.sln 需要在 Visual Studio 构建或者是使用 MSBuild 在命令行中构建。命令行构建的方法如下:
nugetrestoreOpenConsole.slnmsbuildOpenConsole.sln
我们还在 tools 目录下提供了一组常用的脚本可以帮助自动化处理构建和运行测试的过程。
项目包含:
Windows Terminal
Windows 控制台主机 (conhost.exe)
上述两项目的共享组件
ColorTool
示例项目 将展示如何使用 Windows Console APIs