在研究这个问题时,我在 comments 中发现有人提到了ANSI转义代码来获取端子大小.因为我将使用ANSI转义序列,所以我认为这将是一种比ioctl()
或getenv()
更优雅的获得终端大小的方法.
这里有一个关于ioctl()的很好的帖子,这是激起我兴趣的comment:
只是偶然发现了这个答案,当我意识到getenv("列")在运行时非常完美时,我大吃一惊(1).因此,现在我有了一组后备,所有这些都是从TIOCWINSZ ioctl到getenv(如果不是tty的话),再到classic 的ANSI转义"将游标移动到9999,9999和查询游标pos.最后一个可以在嵌入式系统的串行控制台上运行:)
现在,我确实找到了一些关于ANSI的帖子(1,2),但没有一个回答我的具体问题-如何真正做到这一点?
使用this图表,我推断为了将光标移动到最右边和最下面的位置,我需要CUP
(CSI n ; m H
)"光标位置"命令,它可能会翻译成类似\x1b[9999;9999H
的东西.这是最简单的部分,因为它是一个命令.
第二部分是我有大问题的地方.即使我可以推断出我需要DSR
(CSI 6n
)"设备状态报告"命令,并且它是\x1b[6n
,那么这个查询是如何工作的,即,我如何获取数据并将其存储在变量中,最好不中断终端上正在显示的其他数据?