如何“手动”让我的终端返回其(字符)大小?

时间:2016-12-02 11:44:59

标签: python terminal ansi ansi-escape terminal-emulator

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

使用此交互式Python代码段可以看到该机制的效果:

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

Gnome-terminal将在stdin上插入与窗口标题相关的内容。

哪个脚本片段会激活终端写入它的大小(以字符为单位)?如果返回的大小不可见,则应该进行一些简单的转换以查看内容。 Shell,Python,Perl,无论什么语言都可以。由于这将是终端特定的,任何常见的终端仿真器都可以(例如xterm,gnome-terminal,terminator,...)。

澄清:我不关心告诉我大小的程序。我知道TIOCGWINSZ,它不适用于串行线路。我希望看到使用转义序列的代码,它实际上可以通过串行线工作。

2 个答案:

答案 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#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。