我怎样才能“手动”让我的终端达到 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#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。
以下程序保存当前光标位置;将光标移动到 999,999;查询终端当前位置;并恢复光标位置。
假设你的终端小于999x999,这就有效查询了终端的大小。
import sys
print('3[s3[999;999H3[6n3[u')
print(repr(next(sys.stdin)))
资源:
像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#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。
以下程序保存当前光标位置;将光标移动到 999,999;查询终端当前位置;并恢复光标位置。
假设你的终端小于999x999,这就有效查询了终端的大小。
import sys
print('3[s3[999;999H3[6n3[u')
print(repr(next(sys.stdin)))
资源: