1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2015年11月14日 |
---|
#605 in 命令行界面
2,295 星 & 73 关注者
340KB
7K SLoC
notty - 不是打字机
notty 是一个类似 xterm、gnome-vte、sh 或 rxvt 的虚拟终端。与这些程序不同,notty 并不旨在模拟 DEC VT 系列物理视频终端或任何其他物理设备。相反,notty 是一个实验性项目,旨在将新特性引入命令行,这些特性对于其他终端来说是无法实现的。
当前的命令行工具已停滞(如果你更喜欢,'稳定')在 ECMA-48/ISO 6429/ANSI X3.64 转义代码协议周围,该协议基于 1980 年代视频终端设备的功能。实际上,今天使用的所有终端都是在比这些古老机器功能显著更强的设备上运行的虚拟终端,但终端环境并未与这些发展同步。ANSI 转义代码协议的最后修订版本是在 1991 年发布的。
notty 将努力保持终端文本导向、命令行用户界面的真实感,同时扩展它以包括新的更强大的界面特性,例如
- 完全支持丰富的文本格式,包括 24 位的颜色。
- 完全和正确地支持所有 Unicode。
- 无损键盘输入。
- 内联媒体内容,包括位图和结构化数据。
- 下拉菜单、工具提示和其他不严格位于字符网格中的功能。
- 本地回显和保留的离屏字符网格状态,以减少 tty 向终端发送数据的需求。
- 将字符网格细分,以实现更复杂的界面布局,而无需在控制过程中重复实现该逻辑。
- 还有更多!如果你知道任何你希望终端拥有的功能,请打开一个问题并让我们讨论这个问题。
许多这些功能尚未实现。
为了实现这些目标,notty 将实现一个比 ANSI 转义码更一致的新转义协议。这个协议在项目扩展时,比较容易添加新功能。一旦功能集稳定下来,我将编写一个框架,用于创建使用 notty 功能的终端应用程序,该框架基于此协议(允许其他终端实现此协议并支持这些功能)。此框架将包括一个 polyfill,用于尽可能在未实现 notty 代码的终端中模拟这些功能。
此存储库是一个库,它定义了一个将 ANSI 和 notty 转义码转换为终端抽象状态状态变化的引擎。此库不直接实现将状态绘制到屏幕上的任何方法,并且对它用于与控制进程通信的接口一无所知,因此它可能被用于编写不同图形环境中的终端,用于编写类似于 screen/tmux 的服务器端多终端管理器,以及用于编写非 UNIX 环境中的 SSH 客户端。因为它实现了(大多数)ANSI 转义码,所以这个终端与现有的命令行工具向后兼容。
名为 scaffolding 的子目录包含一个使用 GTK/pango/cairo 的最小图形终端,用于交互式测试 notty 的功能。这个终端存在错误且功能不足,不适用于通用使用。
notty 与同一领域内其他项目的重大区别在于,它仅仅是一个虚拟终端,并且完全向后兼容现有的 shell/终端设置。它不实现 shell 的任何功能,并且不是试图完全取代任何现有范式。基于此库的图形终端可以用作其他终端的即插即用替换,但具有可用于实现 shells、文本编辑器和其他实用程序等命令行程序更好界面的新功能。
尽管如此,现有的终端是一堆丑陋的解决方案。从内核的 tty/pty 子系统,到控制它的 termios ioctl 调用,到 terminfo 和 termcap 数据库,再到它们描述的 ANSI 转义码,再到终端仿真器的古老代码库,这是一个充满神秘且文档不佳的老代码宇宙,其中许多代码在 21 世纪对人们不再具有实际用途 - 你的系统包含一个 terminfo 数据库页面,用于超过 2500 个不同的终端设备,其中几乎所有设备都已灭绝,而且每个新控制台在内核中都设置了波特率,尽管它在内存中交换数据。当然,notty 的更高级功能将需要在一定程度上绕过此系统:当前的计划是实现一个将 "切换" notty 到扩展模式的命令;在这种模式下,仅使用 notty 转义码,并将 tty 的所有标志都取消设置,除了 CREAD 和 ISIG(可能甚至不包括 ISIG)。
此实现是用来自 Mozilla 的新兴系统语言 Rust 编写的。
非常感谢 Thomas E. Dickey,xterm 的维护者,其网站 提供了有关 xterm 行为的出色文档,以及感谢 Paul Flo Williams,他维护 vt100.net,该网站托管 DEC VT 系列终端的手册。还要感谢 Gary Bernhardt,他的演讲 A Whole New World 激励我认真追求这个项目。
许可证
notty 是自由软件:您可以按照自由软件基金会发布的 GNU Affero 通用公共许可证 的条款重新分发和/或修改它,可以是许可证的 第3版,或者(根据您的选择)任何更新的版本。
本程序的分发是希望它将是有用的,但没有任何保证;甚至没有关于 适销性 或 适用于特定目的 的暗示性保证。有关更多信息,请参阅 GNU Affero 通用公共许可证。
您应该已经随本程序收到了一份 GNU Affero 通用公共许可证的副本。如果没有,请参阅 https://gnu.ac.cn/licenses/。
行为准则
notty 项目致力于遵守 Rust 行为准则。有关更多信息,请参阅 CONDUCT.md。
依赖项
~2MB
~29K SLoC