如何在Ruby中获取terminal窗口的宽度

你有没有注意到,如果你在Rails中运行rake -T,rake描述列表将被terminal窗口的宽度截断。 所以应该有一种方法来在Ruby中使用它并使用它。

我正在屏幕上打印一些Ascii艺术,我不希望它被打破。 所以我需要找出terminal在运行时的宽度如何。

任何想法如何做到这一点?

我发现在Ubuntu上,如果terminal在Ruby应用程序运行时resize,那么这里指定的其他方法( ENV['COLUMNS']tput columns或hirb)都不会给出正确的结果。 这不是脚本的问题,但对于交互式控制台(如irb)来说却是个问题。

ruby-terminfo gem是目前为止在resize后给出正确尺寸的最佳解决scheme,但它要求您安装额外的gem,并且是特定于unix的。

gem的使用很简单:

 require 'terminfo' p TermInfo.screen_size # [lines, columns] 

TermInfo内部使用TIOCGWINSZ ioctl作为屏幕大小。

或者,正如user83510所提到的,highline的system_extensions也可以工作:

 require 'highline' HighLine::SystemExtensions.terminal_size # [columns, lines] 

一般来说,highline在Unix上使用stty size ,而在其他实现中使用ncurses和Windows。

要监听terminal大小的改变(而不是轮询),我们可以捕获SIGWINCH信号:

 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]) }) 

有一个普通的unix命令:

 tput cols 

这将返回terminal的宽度。

 def winsize #Ruby 1.9.3 added 'io/console' to the standard library. require 'io/console' IO.console.winsize rescue LoadError # This works with older Ruby, but only with systems # that have a tput(1) command, such as Unix clones. [Integer(`tput li`), Integer(`tput co`)] end rows, cols = winsize printf "%d rows by %d columns\n", rows, cols 

链接

如果你想让你的代码跨平台工作,下面是我使用的: http : //github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71

另外检查出highline的system_extensions文件

Ruby实际上带有一个名为“Curses”的内置类,它可以让你用terminal窗口做各种事情。

例如,你可以这样做:

 require 'curses' Curses.init_screen() puts Curses.lines # Gives you the height of terminal window puts Curses.cols # Gives you the width of terminal window 

欲了解更多信息: http : //ruby-doc.org/stdlib-1.9.3/libdoc/curses/rdoc/Curses/Window.html

我有点迟了,但是在rake任务中,我执行以下操作:Rake.application.terminal_width

ENV ['COLUMNS']会给你在terminal的列数。