2016-12-02 57 views
0

resize这样的程序询问终端的大小。最终,他们会发送一些(ANSI)转义序列到stdout,并期望终端对它们自己返回一些字节作出反应。如何“手动”让我的终端返回其(字符)大小?

机制的作用与此交互式Python代码片段可见:

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

Gnome终端将明显插入相关标准输入窗口标题的东西。

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

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

+0

的'stty'程序报告列和行数,你可以看看GNU源的http://代码.metager.de /源极/外部参照/ GNU /的coreutils/SRC/stty.c#get_win_size。它使用'ioctl'。 – cdarke

+0

所以你对[os.get_terminal_size]不感兴趣(https://docs.python.org/3/library/os.html#os.get_terminal_size)? –

+0

可能重复[如何确定ANSI终端的大小?](http://stackoverflow.com/questions/35688348/how-do-i-determine-size-of-ansi-terminal) –

回答

0

我抬离的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操作系统。

+0

它正确地返回行&列在我的konsole和xterm在Linux中,但它在konsole中以像素为单位返回0。 –

+0

这个'ioctl()'做了什么? - 内核不知道终端大小(例如通过串行线路)。 –

+0

不能通过串行线路工作。 –

相关问题