如何确定 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
标准输入和输出连接到实现 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