如何在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的列数。