我或多或少理解所谓的“终端”和“终端模拟器”之间的区别。前者指的是连接到大型计算机之类的设备以与其进行文本交互的实际硬件外围设备,后者是一个允许执行相同操作的软件,但只是在软件中而不是在实际硬件中。
我还了解到,如今,终端仿真器实际上模拟了这些旧终端(如流行的 VT100)向计算机发送键码的方式,可以说是假装是它们。但在我的 Linux 系统上进行一些故障排除和配置的过程中,并遇到了一些奇怪且有点烦人的怪癖,这些怪癖让我思考这一切,我做了一些研究,发现这些设备几乎完全使用键盘与计算机交互(我无法想象鼠标的创建时间足够早,以至于这些类型的终端都可以支持它们),而且由于它们属于计算的早期时代,这些键盘与我们今天通常遇到的键盘有很大不同,并且很大程度上已经被标准化。
我为什么要指出这一点?嗯,像功能键、大写锁定和数字锁定这样的东西在当时的很多终端上通常不会遇到(至少我知道功能键是键盘的一个相对较新的功能)。由于终端仿真器模拟这些终端,因此它们必须使用变通方法才能支持这些键,例如发送特殊的转义序列。根据我的经验,这使得处理键盘和终端仿真器处理键盘的方式比应有的情况复杂得多(至少在我看来是这样)。
事实上,当我试图弄清楚为什么尝试定义涉及 F4 以上功能键的键盘快捷键在某些终端模拟器上不起作用,以及为什么在很多终端模拟器中按这样的功能键(至少)时,我开始思考所有这些问题我有过任何经验的所有这些)在命令行上输入“〜”。 (这是因为这些键发送转义序列而不是专用键码,因为被模拟的终端没有功能键,并且它们要么没有被正确识别,要么结束转义序列的“~”被解释为实际的用户输入的字符。)
我的意思是,为什么我们首先必须模拟这些甚至不存在的古老终端设备(至少我知道)?我知道我们需要软件来允许用户使用键盘与计算机交互以输入命令,从而“模拟终端”,但是终端仿真器仍然假装是这些设备之一有什么好处呢?功能与现代键盘接口的功能有很大不同,并且与现代键盘相比在某些方面缺乏?除非我遗漏了什么,否则在我看来这样做是不合适的,因为自从这些终端以来,现代设备的功能和特性已经不断发展。
这似乎也是不必要的复杂性:为什么不将键盘视为像按钮面板一样简单的东西,这些按钮都将特定的标准键码发送到计算机,而不是处理转义序列来表示几十年前不存在的键?如果仍然存在支持这些旧终端的重大需求,我可能会理解,但我无法想象它们仍然如此广泛使用,以至于这仍然是一个问题。为什么计算机的显示器和键盘的组合本身不被视为终端,为什么我们不定义一种方式让终端模拟器将文本发送到计算机,而不依赖于旧终端的发送方式,并考虑到从那时起计算机界面发生了怎样的变化?
答案1
这是因为这些键发送转义序列而不是专用键码,因为被模拟的终端没有功能键
不。这是因为“终端”协议使用带内信令,默认情况下每个字节都被视为文本,并且任何事物这不是文本必须特别指出(即逃脱了),这本质上意味着键码是“转义序列”。换句话说,转义序列是专用键码。
这并不是说现代终端模拟器发明了转义序列的概念来完成原始终端无法完成的事情。相当,那些终端已经发明了转义序列来完成电传打字机无法完成的事情 - 例如 VT100 确实有 PF1–PF4 功能键,并且它们的“键码”实际上是\e[P
……\e[S
转义序列。同样,程序使用“VT100 转义序列" 控制物理终端的行为(光标移动、文本外观等)
为什么计算机的显示器和键盘的组合本身不被视为终端,为什么我们不定义一种方式让终端模拟器将文本发送到计算机,而不依赖于旧终端的发送方式,并考虑到从那时起计算机界面发生了怎样的变化?
这已经存在了。这就是 X11 的工作原理。这也是 Wayland 的运作方式。底层 Linux 输入和图形 API(evdev 和 drm)或 Windows、macOS、AmigaOS、SunView 等中的图形应用程序也是如此。所有这些 UI 系统都具有用于创建应用程序的 API,这些应用程序不依赖于“旧终端是如何实现的”这一单一因素。
事实上,已经有很多尝试创建不绑定到字符单元格式的命令 shell 界面(在从 X11 到 HTML5 的各种 API 之上),但尽管看起来真的我想他们只是没有看到太多采用。
问题是终端模拟器的目的不是只是“发送文本”,其目的明确是发送文本VT100 和其他此类终端的方式,就像网络浏览器的目的是专门处理 HTML 一样。目前,VT100 终端协议是通用跨平台接口之一,由于其广泛应用而仍然广泛使用。
Windows NT 中的“控制台”根本不是基于 VT 风格的终端仿真 - 它使用带外 Win32 API 调用来执行诸如更改颜色、接收鼠标点击等操作。然而,在 Windows 10 中它最终开始行为类似于 VT 终端。 (事实上,所有原来的 Win32 Console API 函数现在都被标记为“已弃用”。)
“贝尔实验室的 Plan 9”操作系统也有一个带有控制台窗口的窗口系统,根本不支持任何转义码;如果一个程序想要做一些奇特的事情,它会直接在同一窗口中进入图形模式。例如,它的文本编辑器 Sam 和 acme 拥有大部分文本 UI,但没有基于终端的 UI 通常具有的任何限制。 (Plan 9 确实发布了一个专用的“VT 仿真器”应用程序,用于与其他操作系统交互。)
我知道我们需要软件来允许用户使用键盘与计算机交互以输入命令,从而“模拟终端”,但是终端仿真器仍然假装是这些设备之一有什么好处呢?功能与现代键盘接口的功能有很大不同,并且与现代键盘相比在某些方面缺乏?
如前所述 - 终端仿真器充当一个接口大量的现有的软件和硬件生态系统采用类似 VT100 的终端协议。
协议是可扩展;毕竟它最终获得了颜色支持(首先是 8 色,然后是 256 色,然后是 16M 真彩色)和鼠标支持,而这两者最初都不存在于 VT100 中(现在它更常被称为“Xterm”协议而不是“VT100”) ,Terminology 或 Kitty 等程序甚至具有用于显示内联图像、超链接、交互式按钮等的扩展。