这几天我一直在努力寻找信息。需要明确的是,我的目标是创建一个ncurses
类似 C 的库。我完全清楚ANSI 转义序列以及如何使用它们。然而我想要可移植性,因此我对terminfo
数据库感兴趣。我已经阅读了部分文档,例如:
- https://www.tldp.org/HOWTO/Text-Terminal-HOWTO-16.html)
- https://en.wikipedia.org/wiki/Terminfo
- terminfo 的手册页
它让我理解了理论和原理,但在实践中我找不到任何关于如何使用 C 等编程语言访问/连接数据库的示例。
目前我想到的唯一方法是将terminfo
数据库二进制文件加载到内存中并手动执行对其的访问,但我应该构建自己的方案并且没有更简单/实用/官方的方法似乎很奇怪访问这些该死的数据库。
答案1
要访问 FreeBSD 上的 termcap 数据库,有是操作系统中的一种方式。 FreeBSD C 库有一个用于访问的 API能力数据库。所以getcap()
等人。是调用以访问较低级别的 termcap 数据库的函数。 (实际上存在较低级别的 API,但它们并没有像 API 那样抽象出getcap()
功能数据库可以是使用程序构建的可变长度记录平面文件或正确索引的二进制数据库文件这一事实cap_mkdb
。)
更高层次的是tgetent()
、tputs()
、 等。(这些也存在于 terminfo 操作系统上,例如许多基于 Linux 的操作系统。)但是,它们是 FreeBSD C 库中 termcap ncurses 库的一部分;并且您正在尝试创建自己的“类似 ncurses”的库。 (在基于 Linux 的操作系统上,它们是 terminfo ncurses 库的一部分。)
无需通过 ncurses 自己的 terminfo API 即可访问 terminfo 数据库记录的示例是 unibilium 库。 NeoVIM 使用这个。
在更高的层面上……
terminfo/termcap 的想法是更便携到了21世纪的第二个十年,它确实已经达到了临界点甚至更远。您几乎肯定不会遇到不符合 ECMA-48:1976 标准的真正视频终端,更不用说纸质终端了。 terminfo 抽象通常与真实视频终端的功能不符,在某些方面是一种障碍可移植性,因为它们强制采用一种有些扭曲的工作方式。
这尤其适用于终端输入,实际上自 20 世纪 80 年代初以来一直是 ECMA-48(带有一些用于 RXVT、Interix、Linux KVT 和 SCO Console 的状态机 bodges),并且匹配固定字符串的 termcap/terminfo 模型非常差合身。但“本地”/“xmit”计算器键盘、“光标寻址模式”以及只有三种形式的光标表现等理念也与终端的实际工作方式不符。
如果你是如果要重新发明 ncurses,那么请至少不要复制它的颜色对模型。这几乎不符合 ECMA-48 和 AIXterm 颜色系统,更不用说终端已经使用了四分之一个多世纪的 ITU T.416 索引和直接颜色机制。
进一步阅读
getcap
。BSD 库函数手册。免费的BSD。 2002年3月22日。tgetent
。ncurses(3X) 手册 免费的BSD。- https://github.com/mauke/unibilium
- https://unix.stackexchange.com/a/567575/5132
- 乔纳森·德博因·波拉德 (2019)。 ”终端能力”。 C++ 库。诺什工具集。