ncurses及其它库是如何工作的?

27

有几个库(如ncurses)可用于制作命令行GUI。

简单来说,它们是如何工作的呢?

我的第一反应是ncurses拦截所有键盘输入,并通过逐行输出绘制每个“帧”。然而,进一步观察发现,每个新的帧都会覆盖之前的帧。那么它是如何修改已经输出的行呢?此外,它如何处理颜色?

编辑:同样的问题也适用于任何具有“高级”界面的东西,如vimemacs

2个回答

25

文本终端具有命令序列,可以执行在屏幕上移动光标、插入字符、删除行等操作。

每种终端类型都不同,具有自己的一组命令序列。ncurses有一个数据库(详见terminfo)。

在内部,ncurses维护着屏幕的两个视图:当前内容和应用了当前挂起更改后屏幕应该显示的内容。一旦程序请求重新绘制屏幕,ncurses会计算出一种有效的方式来更新屏幕以显示所需的视图。输出的确切字符/命令序列取决于使用的终端类型。


3
你的意思是,如果没有使用旨在实现设备无关性的ncurses控制终端(假设我不在意这一点),那么我可以直接向标准输出写入这些控制字符,即使大多数命令行程序只会在提示符下方打印文本,我也可以更改已显示在屏幕任何部分的文本? - huggie
3
@huggie 是的,但你需要知道程序运行在哪种类型的终端上。Ncurses会自动处理这个问题。 - altermetax

6

curses(以及我认为ncurses也是)通过在屏幕上移动光标来工作。有控制序列来执行这些操作。再次查看代码,你会看到它们。这些序列不是ASCII控制字符,它们是以(嗯...)ESC开头的字符串。点击此处了解更高级的解释。


大多数终端支持(某些)ANSI转义序列。它们以\033[开头,其中\033确实是ESC。您可以使用echo -e在自己的终端上玩耍,打印一些并查看发生了什么。(如果您已将终端设置为不可见,则“reset”(盲打并按Enter键)将是您的朋友...) - 5gon12eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接