您是否注意到,如果在rails中运行rake-T,rake描述列表会被终端窗口的宽度截断.所以应该有一种方法可以在Ruby中使用它.
我正在屏幕上打印一些Ascii艺术,我不想让它被 destruct .因此,我需要找出运行时终端的宽度.
知道怎么做吗?
您是否注意到,如果在rails中运行rake-T,rake描述列表会被终端窗口的宽度截断.所以应该有一种方法可以在Ruby中使用它.
我正在屏幕上打印一些Ascii艺术,我不想让它被 destruct .因此,我需要找出运行时终端的宽度.
知道怎么做吗?
我发现,在Ubuntu上,如果在Ruby应用程序运行时调整终端大小,这里指定的其他方法(ENV['COLUMNS']
、tput columns
或hirb)都不会给出正确的结果.这不是脚本的问题,而是交互式控制台(如irb)的问题.
ruby-terminfo gem是迄今为止我发现的最好的解决方案,可以在调整大小后提供正确的尺寸,但它需要安装额外的gem,并且是特定于unix的.
gem的用法很简单:
require 'terminfo'
p TermInfo.screen_size # [lines, columns]
TermInfo内部使用TIOCGWINSZ ioctl作为屏幕大小.
或者,正如user83510所提到的,highline的system_扩展也可以工作:
require 'highline'
HighLine::SystemExtensions.terminal_size # [columns, lines]
highline在Unix上使用stty size
,在ncurses和Windows上使用其他实现.
为了监听终端大小的变化(而不是轮询),我们可以捕获信号:
require 'terminfo'
Signal.trap('SIGWINCH', proc { puts TermInfo.screen_size.inspect })
这对于使用Readline的应用程序特别有用,例如irb:
Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) })