我一直在努力寻找能够帮助我找到所需信息的词语。我想创建一个“接管”终端并可以与其进行互动的终端应用程序 - 例如man
,less
,top
等
如果我的第一个目标是创建一个应用程序,当在终端中运行时根据不同的按键显示一些静态输出,然后在'q'按下退出到命令提示符 - 我需要什么样的库/框架要看?
我了解shell脚本和终端的方法,但不知道上述应用程序如何实现他们在终端中的“交互性”方面所做的工作。
对于含糊不清的道歉 - 就像我说的那样,我正在努力寻找找到所需信息所需的词语,只需要朝着正确的方向努力。
答案 0 :(得分:5)
您正在寻找一个文本用户界面应用程序,该应用程序提供全屏用户界面,而不是简单的滚动玻璃电传打字机一。这些应用程序从滚动模式将终端切换到光标寻址模式,并使用终端控制序列在显示屏周围移动光标并设置属性和颜色。
这些控制序列因终端类型而异,并且系统上有一个 terminfo数据库或 termcap数据库,它采用终端类型,在TERM
环境变量中指定,并将其映射到包含一组终端功能的记录。终端功能描述终端的行为方式,包括是否具有自动边距和背景颜色擦除,并向应用程序描述设置图形再现控制序列用于执行各种抽象操作,如“输入突出模式”和“退出突出模式”。
除此之外还有ncursesw
库之类的内容,这是一个可以用编程语言编写的编译程序的函数库,如 C 或 C ++ 。该库有一个应用程序编程接口,它包含各种抽象概念,如 windows 和 panes 。它还提供了键盘输入的抽象,可以根据键盘代码进行操作。在内部,它使用termcap / terminfo来确定如何根据发送到终端设备的实际字符序列来呈现抽象。
ncursesw
键盘输入位于将终端从规范输入模式切换到非规范输入模式(在POSIX标准之前已知)的顶部分别为熟入输入模式和原始输入模式)。在非规范输入模式中,终端线路规则不会执行它在规范输入模式下执行的所有行编辑。 特殊字符未经过特殊处理,read()
系统调用不会等待换行符或其他行分隔符字符受到线路纪律的接受。
具有讽刺意味的是,你会在万维网上看到很多doco,它会告诉你所有关于规范输入模式的信息,就像它是常态一样。事实上,如果您的世界涉及全屏TUI应用程序和具有命令行编辑功能的现代 shell (使用ZLE,libedit
等库构建,或{ {1}})你的线路规则现在几乎从未处于规范模式。规范模式不是常态,而是例外,当您运行非交互式程序时,很大程度上(并且具有讽刺意味)适用。
不直接映射到字母数字字符,标点符号或控制字符的键会在下线>强>由终端作为控制序列。 termcap / terminfo数据库中的终端功能描述了读取这些控制序列的应用程序应如何将它们映射到首先触发发送它们的功能键或扩展键。因为按下转义键的人与实际控制序列之间存在歧义,所以程序必须通过定时读取的输入执行稍微复杂的舞蹈。这是在上述库中为您完成的。