交互式终端应用程序的构建块

mar*_*ers 2 terminal

我一直在努力寻找能够帮助我找到所需信息的词语.我想创建一个终端应用程序,"接管"的终端,并且可以与之交互-样man,less,top

如果我的第一个目标是创建一个应用程序,当在终端中运行时根据不同的按键显示一些静态输出,然后在'q'按下退出到命令提示符 - 我需要查看哪种类型的库/框架在?

我知道我的身边一个shell脚本和终端的方式,但没有一个想法上述应用程序如何实现他们在终端的"互动性"方面做什么.

对于含糊不清的道歉 - 就像我说的那样,我正在努力寻找我需要的信息来找到我需要的信息,只需要朝着正确的方向努力.

Jde*_*eBP 5

您正在寻求写文本用户界面呈现一个应用程序全屏显示的用户界面,而不是一个简单的滚动玻璃电传打字机之一.这些应用程序将终端切换到光标寻址模式,从滚动模式切换,并使用终端控制序列在显示器周围移动光标并设置属性和颜色.

这些控制序列因终端类型而异,系统上有一个terminfo数据库termcap数据库,它采用TERM环境变量中指定的终端类型,并将其映射到包含一组终端功能的记录.终端功能描述终端的行为方式,包括它是否具有自动边距背景颜色擦除,并向应用程序描述使用什么设置图形再现控制序列来执行各种抽象操作,如"进入突出模式"和"退出突出模式" .

最重要的是像ncursesw库这样构建的东西,它是一个函数库,可以用编程语言(CC++)编写的编译程序访问.该库具有应用程序编程接口,包括各种抽象概念,如窗口窗格.它还提供了键盘输入的抽象,可以根据键盘代码进行操作.在内部,它使用termcap/terminfo来确定如何根据发送到终端设备的实际字符序列来呈现抽象.

ncursesw键盘输入被层叠在从终端切换顶端规范输入模式非规范输入模式(POSIX标准之前已知的熟输入模式原始输入模式分别).在非规范输入模式中,终端线规则并不执行它在规范输入模式下所做的所有行编辑.将特殊字符不经过特殊处理和read()系统调用不会等待一个新行或其他行分隔符字符由线路规程接收.

具有讽刺意味的是,你会在万维网上看到很多doco,它会告诉你关于规范输入模式的所有信息,就像它是常态一样.实际上,如果您的世界涉及全屏TUI应用程序和具有命令行编辑功能的现代shell(使用ZLE ,或等库构建),那么您的线路规则现在几乎从不在规范模式中.规范模式不是常态,而是例外,当您运行非交互式程序时,很大程度上(并且具有讽刺意味)适用.libeditreadline

不直接映射到字母数字字符,标点符号控制字符的键由终端作为控制序列发送到线路.termcap/terminfo数据库中的终端功能描述了读取这些控制序列的应用程序应如何将它们映射到首先触发发送它们的功能键扩展键.因为按下转义键的人和实际的控制序列之间存在歧义,所以程序必须通过定时读取其输入来执行稍微复杂的舞蹈.这是在上述库中为您完成的.

进一步阅读