当我在命令行上编写程序时,我注意到有一些限制。例如,当窗口中的窗格分开时,我无法像tmux那样绘制1像素厚的水平或垂直线。我只能将光标向下移动,而不是像VI看起来那样向上移动。如果光标位于底部,我无法刷新页面顶部的信息。
所以,当像tmux和vi这样的程序这样做时,我不得不怀疑它们是否是:
每次更新时从上到下绘制屏幕(我认为这种情况极不可能,否则我可以在我的终端中向上滚动并查看每次重绘)
使用一些在终端中启用图形的库,比如SDL,我认为这不太可能。
使用一些标准的系统调用我不知道
或最后
那么,这些程序如何在看似有限的shell中生成如此丰富的UI?只要答案给了我足够的饲料来进行谷歌横冲直撞,我就会感到高兴。
我还假设这些程序使用一些常用的方法来做这些事情,但如果错误让我知道。
答案 0 :(得分:1)
您可以通过将终端置于原始模式并使用低级操作直接写入终端来手动完成,但标准方法是使用ncurses库。
答案 1 :(得分:1)
典型的终端仿真器具有比直接显而易见的更多功能。
本质上,程序只需要输出表示各种命令的短字节序列,例如移动光标(向上|向下|向左|向右|),更改颜色,滚动区域,擦除区域等。
这些命令通常以转义字符(在键入终端时按esc键时生成的相同字符)开头,后跟各种其他字符,具体取决于所需的操作。
理解其工作原理的一个很好的起点是关于ANSI escape codes
的维基百科文章