如何确定 ANSI 终端的大小?

How do I determine size of ANSI terminal?

标准输入和输出连接到实现 ANSI 转义序列但尺寸未知的终端。

我需要知道终端有多大,以便于在上面绘制全屏文本 UI。我怎样才能得到尺寸?

没有将正确的大小加载到环境变量中。我不能使用 TIOCGETS;调用会 return 成功,但值不正确——内核也不知道大小。

搜索 Whosebug 有很多很多答案,但它们都依赖于 OS 以一种或另一种方式提供答案;但这次不是这样。

我能找到的最好线索是 return 当前光标位置的 DSR 命令;但是没有移动到 bottom/right 命令。

resize 程序通过将光标移动到非常大的列和行来完成此操作;终端尽可能地移动,例如,

CUP 999 999

然后resize询问光标在什么地方:

DSR 6

终端回复实际光标位置(即光标位置报告CPR),从中resize知道终端的大小:光标在右下角。

这一切都是使用标准完成的(ECMA-48 / VT100) escape sequences. In XTerm Control Sequences(应该适用于您的 "ANSI" 终端)

CSI Ps n  Device Status Report (DSR).
            Ps = 6  -> Report Cursor Position (CPR) [row;column].
          Result is CSI r ; c R