#ansi #terminal #vte #tty #no-std #state-machine

yanked termit-ansi

终端ANSI序列解析器

0.2.1 2019年3月28日
0.2.0 2019年3月28日
0.1.1 2019年2月25日

#14 in #vte

MIT 协议

81KB
2K SLoC

状态

虽然还处于早期阶段,但我们已经可以提取大部分序列。设备输入为从ANSI键盘和鼠标的混乱中提取一些有意义的输入提供了方便的快捷方式。

虽然termit-ansi是termit更高层次计划的一部分,但这个小家伙也打算在那些你不会进入tokio和异步处理奢华的嵌入式设备上使用。

目标:[x] 可移植。因为我们不接触IO,只依赖于核心。 [x] 默认为no_std - 不需要分配器,只依赖于核心。 [x] 使用相同的方法处理设备和主机序列。 [x] 使用易于使用的API全面覆盖用户按键和鼠标事件。 [ ] 使用类似设备输入的API轻松处理主机输出。 [ ] 测试良好,API稳定。 [x] Nightly Rust,没有特殊功能。 [x] Stable Rust,没有特殊功能。

安装

将此添加到您的 Cargo.toml

[dependencies]
termit-ansi = "0"

注意,API仍然是不可稳定的。请使用最新版本。

使用

查看示例文件夹,特别是vt.rs和ansi.rs

您可以使用解析器进行处理,解析器会为您处理流:AnsiParserAnsiDeviceParserAnsiHostParser。这就是简单的termit之旅。

为了更多控制,您可以直接使用状态机:AnsiMachineSequenceMachineUtf8Machine,并自行处理流。

解析器

您将使用其内部缓冲区初始化解析器。这很重要,因为因为没有分配,解析器无法动态地进行。它必须使用一个固定大小的缓冲区,以适应所选的少数几个。

您还需要为特定解析器实现一个处理程序。这并不太难。一个方法就足够了。

然后使用任何新数据调用parser.parse(handler, input)。当您的解析完成时,调用parser.close()并检查剩余的数据。

解析器有时会将它们缓冲区中的数据引用作为处理程序调用的一部分传递。这是为了避免分配。你可能对此表示满意,或者需要将 &str&[u8] 位复制到一些分配的空间中,包括形成新的结构来保存这些数据。后者是 termit-io 的任务,它将抽象出 ANSI 的疯狂,并呈现一些可靠的模式。

无运行时依赖

功能