我怎样才能“手动”让我的终端达到 return 它的(字符)大小?

How can I “manually” get my terminal to return its (character) size?

resize这样的程序询问终端它的大小。最终他们会将一些 (ANSI) 转义序列发送到 stdout,并期望终端对这些序列做出反应,自行返回一些字节。

此交互 Python 片段可以看到该机制的效果:

>>> print('\x1b[21;t')

Gnome-terminal 将在标准输入中明显地插入与 window 标题相关的内容。

哪个脚本片段会促使终端写入它的大小(以字符为单位)?如果返回的大小不可见,则应该进行一些简单的转换才能看到一些东西。 Shell、Python、Perl,什么语言都行。由于这将是特定于终端的,因此任何常见的终端仿真器都可以(例如 xterm、gnome-terminal、terminator 等)。

澄清:我不关心告诉我大小的程序。我知道 TIOCGWINSZ,它不能通过串行线路工作。我想查看使用转义序列的代码,它实际上在串行线路上工作。

我在 http://code.metager.de/source/xref/gnu/coreutils/src/stty.c#1739stty(1) 的 GNU 源代码中提取了这项技术。我在 OS X 上测试过它,我不能保证它在其他地方也能工作,但值得一试。

import fcntl
import termios
import struct

pad = "0" * 8
s = fcntl.ioctl(1, termios.TIOCGWINSZ, pad)
sz = struct.unpack('hhhh', s)
print("rows: {} columns: {}, xpixels: {}, ypixels: {}". format(*sz))

在我的机器上给出:

rows: 24 columns: 80, xpixels: 1200, ypixels: 600

编辑:os.get_terminal_size 的源代码在 Modules/posixmodule.c 中,带有一个名为 get_terminal_size 的函数。其中一种机制如上所示,但还有其他依赖于宏 TERMSIZE_USE_IOCTLTERMSIZE_USE_CONIO 的机制,CONIO 路由用于 Windows。

以下程序保存当前光标位置;将光标移动到 999,999;查询终端当前位置;并恢复光标位置。

假设你的终端小于999x999,这就有效查询了终端的大小。

import sys
print('3[s3[999;999H3[6n3[u')
print(repr(next(sys.stdin)))

资源: