您是否注意到,如果在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]) })

Ruby相关问答推荐

使用map DO使用嵌套数组重构对象数组

Ruby:一个方法可以返回不同类型的对象吗?

为什么数组中的 splat 如此昂贵?

是否可以在 Ruby 中使用正则表达式匹配字符串\b(退格字符)?

如果嵌套数组为空,如何判断 ruby​​?

有人可以解释 Ruby 在块中使用管道字符吗?

如何在 Ruby 中合并多个哈希?

什么是 Sinatra/Rack 的非常简单的身份验证方案

查明 IP 是否在 IP 范围内

Ruby 中的排序稳定吗?

Ruby 中的 -> (stab) 运算符是什么?

无法对 ruby​​ 哈希使用点语法

如何从 Ruby 判断具有特定 pid 的进程是否正在运行?

在 Ruby 中计算中位数

如何打破Ruby中的外循环?

判断ruby中的字符长度

Ruby - Array#<< 和 Array#push 之间的区别

Array.empty 的相反方法是什么?或 [].empty?在Ruby中

如何在 IRB 中重新加载脚本?

何时在 Ruby 中使用 Struct 而不是 Hash?