resize
等程序向终端询问其大小。最终,他们会向stdout发送一些(ANSI)转义序列,并期望终端自己对这些转发做出反应,返回一些字节。
使用此交互式Python代码段可以看到该机制的效果:
>>> print('\x1b[21;t')
Gnome-terminal将在stdin上插入与窗口标题相关的内容。
哪个脚本片段会激活终端写入它的大小(以字符为单位)?如果返回的大小不可见,则应该进行一些简单的转换以查看内容。 Shell,Python,Perl,无论什么语言都可以。由于这将是终端特定的,任何常见的终端仿真器都可以(例如xterm,gnome-terminal,terminator,...)。
澄清:我不关心告诉我大小的程序。我知道TIOCGWINSZ,它不适用于串行线路。我希望看到使用转义序列的代码,它实际上可以通过串行线工作。答案 0 :(得分:3)
以下程序保存当前光标位置;将光标移动到999,999;查询终端当前位置;并恢复光标位置。
假设您的终端小于999x999,这有效地查询了终端的大小。
import sys
print('\033[s\033[999;999H\033[6n\033[u')
print(repr(next(sys.stdin)))
资源:
答案 1 :(得分:0)
我在http://code.metager.de/source/xref/gnu/coreutils/src/stty.c#1739的stty(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_IOCTL
和TERMSIZE_USE_CONIO
,CONIO路由用于Windows。