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

时间:2010-01-15 01:26:53

标签: ruby unix terminal

您是否注意到如果在rails中运行rake -T,则rake描述列表会被终端窗口的宽度截断。所以应该有一种方法可以在Ruby中使用它并使用它。

我正在屏幕上打印一些Ascii-art,我不希望它被打破。因此我需要在运行时找出终端的宽度。

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

9 个答案:

答案 0 :(得分:45)

我发现在Ubuntu上,如果在Ruby应用程序运行时调整终端大小,则此处指定的其他方法(ENV['COLUMNS']tput columns或hirb)都不会给出正确的结果。这不是脚本的问题,但它是交互式控制台的问题,例如irb。

ruby-terminfo gem是迄今为止我发现的最佳解决方案,可以在调整大小后提供正确的尺寸,但它需要您安装其他gem,并且是特定于unix的。

宝石的用法很简单:

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上使用其他实现。

要监听终端大小的变化(而不是轮询),我们可以捕获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]) })

答案 1 :(得分:43)

有一个常见的unix命令:

tput cols

返回终端的宽度。

答案 2 :(得分:26)

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

Link

答案 3 :(得分:9)

如果您希望代码跨平台工作,请使用以下内容:http://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71

另请查看highline

中的system_extensions文件

答案 4 :(得分:5)

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

答案 5 :(得分:5)

Ruby实际上附带了一个名为“Curses”的内置类,它允许您使用终端窗口执行各种操作。

例如,您可以这样做:

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

答案 6 :(得分:3)

ENV ['COLUMNS']将为您提供终端中的列数。

答案 7 :(得分:2)

    require 'io/console'
    puts "Rows by columns: #{IO.console.winsize}"
    puts "Ruby 2.6.4"

答案 8 :(得分:1)

我写了tty-screen gem来检测不同OS系统和Ruby解释器之间的终端大小。它涵盖了许多检查大小的方法,包括Windows上的Win API,JRuby上的Java库和Unix实用程序。

这是一个模块,您可以将其包含在班级中或直接调用:

require 'tty-screen'

TTY::Screen.size     # => [51, 280]
TTY::Screen.width    # => 280
TTY::Screen.height   # => 51

有关更多信息,请参见:https://github.com/piotrmurach/tty-screen