一个新的命令行界面的曙光

2021-04-13 19:06:33

免责声明:这是一个技术帖子,旨在开发人员有点了解问题空间。将有一个结论的“......”帖子的旨在最终用户,其中一些福利将以更强大的光明证明。

几个月后,我写了一个打火机帖子,关于重塑古老的Linux / BSD CLI的持续努力,不受旧终端协议的仿真的遗留CRUFT,强调这些协议所做的一点CLI效率较低,难以从用户和开发者角度工作。在这篇文章中,我们将重新回顾一些问题,通过待处理的解决方案,使用当前的进度和目标更新,并查看已剩下的操作。

终端仿真器和命令行shell之间的拆分中断桌面集成 - 诸如Windows,边框和弹出窗口之类的视觉分区,使用副本粘贴操作中不需要的字符进行模拟,并且无法与外部桌面壳(如果有的话)集成。

代码/数据混淆 - 终端仿真器和面向文本的用户界面(TUIS)都尝试使用大型各种编码方案的元数据分离内容,所有这些方案都容易出错,滥用,难以解析和乘坐遗产。

不确定的功能/功能集 - 诸如颜色深度,调色板,字符编码方案等的基本内容都是通过破碎的环境变量的破碎的MishMash探测,能力数据库和实际支持随着所使用的终端仿真器而异。

用户输入和数据之间的困惑 - 程序无法可靠地区分交互式(键盘)输入,粘贴/“IPC”输入和其他形式的数据输入。

缺乏同步。这使得终端仿真器无法知道何时应该绘制,并且信号传播有助于使调整大小操作慢。

这只是在涉及用户交互,一致性,一致性时划伤表面并不会进入相关问题,并且当涉及到TTY设备时,输入模式,虚拟终端交换等时,忽略系统交互的整个问题空间。

如果您考虑过的所有协议的所有功能集,您可以获得一个非常“Cronenberg” - 至少在显示服务器上,至少找到终端仿真器和昆虫打字机之间的令人毛骨悚然的相似之处赤裸午餐同时有趣,悲惨和恐惧;一个人期望的基本特征在那里,以及一些非常不需要的,但以一种直接的恶心方式拼凑在一起。如果我们还包含相关的库和工具,如诅咒和turbo vision,我们会获得常规点的笨重版本,然后单击UI工具包。尽管范围可以说是更狭隘和明确的定义,但这些库在概念上与QT,GTK和电子的相似之处不远。研究Unicode,不应该很难看到“文本”大多是图形,到目前为止的最大差异是最小的原子,最大的状态空间爆炸来自称为“像素”而不是单元格。

所以第一个问题是,为什么甚至烦扰在这个频谱中做任何事情,而不是保持状态quo?毕竟,我们可以争辩说,我们可以在今天使用Qt在Xorg上运行Qt,无需改变 - 这不是人们通常采取的道路;也许它是有利于鼠标或触摸导向的用户互动的范式,即在此处“在故障”中,随着物质的偏好风格和美学。一个对立面是支持Toolkit +显示服务器方法所需的基础设施是肥胖的肥胖进入数百万的代码时,当问题空间应该在数千岁内可解决,但“所以,我们有Teraflops和teraflops千兆字节备用!“。好的,写作软件的个人投资怎么样?适合残疾?攻击表面?产生输出的移动性和可变性? (培训)运营商的效率?或者当所述基础架构不可用?列表继续。

在那些喜欢'在浏览器中的浏览器中推送它'或flashy的UI之间的人之间可以说,随着您的互动,以及更喜欢盯着文本编辑器的浏览器的uis。在我看来,前面的类别得到了所有奇特的新玩具,而后者嘀咕着关于不可逾越的遗产水平。我个人想要的是更多的“单一目的”,以及他们更容易发展。他们需要更简单,更一致,明显使用,更可配置。这很好,梦幻般的,但“我们”应该如何到达那里?

首先,让我们考虑一下Arcan项目的一些相关组件,因为所提出的解决方案以一种非常具体的方式重新配置这些。以下图片显示了当前组件的跨度:

这一次,我们只对Shmif,终端和Tui的零件感兴趣。其他一切都可以忽略。 Shmif是结构胶水/客户端IPC。 TUI是一个面向SHMIF的API的开发人员,但实际保证是前进/向后兼容API。终端是使用修改和扩展版本的Libtsm构建的VTXXX终端仿真器/状态机。

由此,我们采取框架(IPC) - 块,我们将其放入自己的SHMIF-Server库中。我们采取平台块并分成自己的LibArcan-ABC。终端扩展到能够将这两个API与TUI API的可选LUA /任何绑定一起使用,使得具有其所有字符串处理ickines的更高级别的shell CLI逻辑可以写入不是C.这打开了门两种配置。从更复杂的开始,我们得到这个数字:

在这里,Arcan用作主显示服务器,或者用另一个连接到渲染(有用于低级和高级系统集成的平台层的实现)。运行的'Appl'充当窗户管理器(实际上可以是一个琐碎的,只需用作普通屏幕或Alt + Fn VT交换样式,只有几行代码,它可能会产生一个或许多AFSRV_TERMINAL。这些可以在“兼容模式”中运行,其中仿真器状态机被激活,它就像Xterm和朋友一样。

在此模式下,终端直接使用平台层来驱动显示和示例输入。如果需要,它甚至可以直接在启动时执行此角色。 Shmif的一个有趣的属性在这里是对不同连接模式的支持(我会在另一个帖子中详细说明),您可以在那里交互迁移和委派连接基元。这意味着您可以在运行时在这两个配置之间切换,而不数据丢失 - 甚至可以在显示服务器崩溃的情况下生存并重新连接。

无论配置,您(shell后面的幽灵)都可以访问SHMIF中的所有功能,并可以决定哪些应该使用哪些应该被拒绝。您可以通过shell(以及复杂版本的应用程序)中的选择来控制路由。回想一下,Prime目标现在是当地的面向文本,命令行接口 - 没有改变或篡改awk | SED | grep | ......流动,这是一个完全不同的野兽。与诅咒和类似的解决方案相比,这种方法还避免使用STDIN,STDOUT,STDERR或ARGV来篡改,因为连接基元和调用参数是通过ENV的继承或传递的。这应该意味着可以在IFDEF地狱或破坏现有代码方面没有多大地完成现有工具。

无论如何,大多数情况都不只是来自一些致幻视觉的蒸气,而且事实上已经过了一段时间已经实施并在测试中进行了测试。目前正在进行的内容以及不久的将来正在提高一些现有阶段的质量和添加:

虚拟单元屏幕级别的双重缓冲以增加对子单元格“平滑”滚动,文本整形,BIDI和非操作区的支持,正确攻击,文本呈现。

用于指定定制输入的区域(ALT-SCHEE模式)或线条(正常模式)的API和结构,特别是从其他TUI客户端或帧群维护者混合/编写内容。

Shmif-server-proxy工具,可以转换为-/ from-a网络或管道传递的'行格式'(协议),以实现网络支持和测试高延迟/数据包丢失行为。

如果所有这些步骤都成功,最后的“棺材中的钉子”将是提供一个替代平台输出目标,可以撤消所有这项工作并再次输出到符合VT100的副本 - 所有这些都是为了向后兼容。 该部分与“组成”的最终结果(合并所有层),那部分是相对的,它是(主要)在这里(主要)在这里发生故障,因为信息不可逆转地丢失。 在这种情况下,它刚刚使得输出侧(台式计算机代替哑终端)的特征范围以及由于通信语言而不匹配的输入侧(客户端)的功能。