1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2015年12月27日 |
---|
#923 在 命令行界面
2,295 个星标 & 73 个关注者
36KB
806 行
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 将数据发送回终端的需要。
- 将字符网格细分,以便在不重复实现该逻辑的情况下实现更复杂的界面布局。
- 等等!如果您知道您希望终端具有的功能,请打开一个 issue 并让我们讨论这个问题。
许多这些功能尚未实现。
为了实现这些目标,notty将实现一个比ANSI转义码更新、更一致的转义协议。随着项目的增长,这个协议将相对容易扩展新功能。一旦某个功能集稳定下来,我将编写一个框架,用于创建使用notty功能的终端应用程序,该框架针对此协议编写(允许其他终端实现该协议并支持这些功能)。这个框架将包括一个polyfill,以尽可能在未实现notty代码的终端中近似这些功能。
这个存储库是一个库,它定义了一个引擎,用于将ANSI和notty转义码转换为终端的抽象状态状态变化。这个库不直接实现将状态绘制到屏幕上的任何手段,并且对它用于与控制进程通信的接口一无所知,所以它应该可以用于编写不同图形环境中的终端,编写类似screen/tmux的服务端多终端管理器,以及编写非UNIX环境中的SSH客户端。因为它实现了(大多数)ANSI转义码,这个终端与现有的命令行工具向后兼容。
一个名为scaffolding的子目录包含一个使用GTK/pango/cairo的最小图形终端,旨在交互式测试notty的功能。这个终端存在错误且功能贫乏,并不适用于通用用途。
notty与其他同一空间内的项目的主要区别在于,这只是一个虚拟终端,并且与现有的shell/终端设置完全向后兼容。它不实现shell的任何功能,也不试图完全取代任何现有范式。基于这个库的图形终端可以作为其他终端的直接替换使用,但具有可用于实现命令行程序(如shell、文本编辑器和其它实用工具)更好界面的新功能。
尽管如此,现在的终端就像一堆丑陋的拼凑物。从内核的tty/pty子系统,到控制它的termios ioctl调用,再到terminfo和termcap数据库,再到它们描述的ANSI转义码,再到终端模拟器的古老代码库,这是一个充满晦涩且文档不佳的老代码世界,其中许多在21世纪对人们不再具有实际用途 - 你的系统带有超过2500个不同终端设备的terminfo db页面,几乎全部都已灭绝,而每个新控制台在内核中都有一个波特率设置,尽管它是在内存中交换数据的。notty的更高级功能无疑需要在一定程度上绕过这个系统:当前的计划是实现一个命令来“切换”notty到扩展模式;在这种模式下,将只使用notty转义码,tty的所有标志都将除CREAD和ISIG(也许甚至不包括ISIG)之外全部取消设置。
这个实现是用Rust编写的,这是Mozilla的一个令人兴奋的新系统语言。
非常感谢
许可证
notty是免费软件:您可以在自由软件基金会发布的GNU Affero通用公共许可证的条款下重新分发和/或修改它,无论是许可证的第3版,还是(根据您的选择)任何较新版本。
本程序以供使用为目的进行分发,但没有任何保证;甚至不包括对适销性或适用于特定目的的适用性的暗示保证。有关更多信息,请参阅GNU Affero通用公共许可证。
您应已随本程序收到GNU Affero通用公共许可证的副本。如果没有,请参阅http://www.gnu.org/licenses/。
行为准则
notty项目致力于遵守Rust行为准则。有关更多信息,请参阅CONDUCT.md。
依赖项
~7MB
~173K SLoC