如何确定ANSI终端的大小?

Jos*_*hua 6 language-agnostic terminal ansi ansi-escape

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

我需要知道终端有多大,以便于在其上绘制全屏文本UI.我该如何获得尺寸?

正确的大小不会加载到环境变量中.我不能使用TIOCGETS; 调用将返回成功但值不正确 - 内核也不知道大小.

搜索stackoverflow有很多很多答案,但它们都依赖于操作系统提供单向或反向的答案; 但这次不是真的.

我能找到的最好的线索是返回当前光标位置的DSR命令; 但是没有向底部/右侧命令移动.

Tho*_*key 9

resize程序通过将光标移动到一个非常大的列和行执行此; 终端尽可能地移动,例如,

CUP 999 999
Run Code Online (Sandbox Code Playgroud)

然后resize问光标所在:

DSR 6
Run Code Online (Sandbox Code Playgroud)

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

这一切都是使用标准(ECMA-48/VT100)转义序列完成的.在XTerm控件序列中(应该适用于"ANSI"终端)

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