当我编写用于命令行的程序时,我注意到存在一些限制。例如,我无法像 tmux 在分隔窗口中的 Pane 时那样绘制 1 像素粗的水平线或垂直线。我只能向下移动光标,不能像 VI 那样向上移动。如果光标在底部,我无法刷新页面顶部的信息。
所以,当像 tmux 和 vi 这样的程序这样做时,我不得不怀疑它们是否:
每次更新都从上到下绘制屏幕(我认为这不太可能,否则我可以在终端中向上滚动并看到每次重绘)
使用一些在终端中启用图形的库,例如 SDL,我也认为这不太可能。
使用一些我不知道的标准系统调用
或者最后
- 利用我完全不知道的 Linux/Unix 的某些功能。
那么,这些程序如何在看似有限的 shell 中生成如此丰富的 UI?只要答案给我足够的饲料来继续谷歌横冲直撞,我就会很高兴。
我还假设这些程序使用一些通用方法来做这些事情,但如果那是错误的请告诉我。
最佳答案
典型的终端仿真器具有的功能比立即显现的要多得多。
本质上,一个程序只需要输出代表各种命令的短字节序列,例如移动光标(上|下|左|右)、改变颜色、滚动区域、删除区域等。
这些命令通常以转义字符(与您在终端中键入时按 esc 键时生成的字符相同)开头,后跟各种其他字符,具体取决于所需的操作。
了解其工作原理的一个很好的起点是关于 ANSI escape codes 的维基百科文章。
关于linux - tmux、vim、emacs 等如何超越 *nix 终端的 UI 限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31904111/