【问题标题】:How can I “manually” get my terminal to return its (character) size?我怎样才能“手动”让我的终端返回它的(字符)大小?
【发布时间】:2017-04-17 07:41:30
【问题描述】:

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

通过这个交互式 Python sn-p 可以看到机制的效果:

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

Gnome-terminal 将在标准输入上明显插入与窗口标题相关的内容。

哪个脚本 sn-p 会触发终端写入它的大小(以字符为单位)? 如果大小返回不可见,则应进行一些简单的转换以查看某些内容。 Shell、Python、Perl,任何语言都可以。由于这将是特定于终端的,因此任何常见的终端仿真器都可以(例如 xterm、gnome-terminal、终结器...)。

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

【问题讨论】:

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


【解决方案1】:

我从stty(1) 的GNU 源代码http://code.metager.de/source/xref/gnu/coreutils/src/stty.c#1739 中提取了这项技术。我在 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。

【讨论】:

  • 它在 Linux 中的 konsole 和 xterm 中为我正确返回行和列,但在 konsole 中以像素为单位的尺寸返回 0。
  • 这个ioctl() 有什么作用? – 内核不知道终端大小(例如通过串行线路)。
  • 如果您想知道它的作用,请发送man ioctl1 是标准输出文件描述符。如果您使用的是某种模拟器,那么我希望模拟器能够通知服务器端大小的任何变化。 stty -a 有效吗?如果是这样,然后像我一样从源代码开始工作。
  • 您是否按照@PM2Ring 的建议尝试了os.get_terminal_size(或shutil.get_terminal_size)?
  • 这以及stty -a 不适用于连接到串行线路的终端。这就是为什么 xterm 的 resize 通过其他方式获取终端几何并调用TIOCSWINSZ 使得后面的TIOCGWINSZ 查询返回正确值的原因。
【解决方案2】:

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

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

import sys
print('\033[s\033[999;999H\033[6n\033[u')
print(repr(next(sys.stdin)))

资源:

【讨论】:

  • FWIW,xterm的resize使用的actual escape string是:ESCAPE("7") ESCAPE("[r") ESCAPE("[9999;9999H") ESCAPE("[6n")那么\033[u的作用是什么,\033[s\0337\033[r有什么不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2012-04-29
  • 2015-04-13
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多