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

All*_*rgi 45 ruby unix terminal

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

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

任何想法怎么做?

Ral*_*alf 45

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

红宝石的terminfo宝石是我发现至今调整大小后得到正确的尺寸的最佳解决方案,但它需要你安装一个额外的宝石,而且是UNIX特定的.

宝石的用法很简单:

require 'terminfo'
p TermInfo.screen_size        # [lines, columns]
Run Code Online (Sandbox Code Playgroud)

TermInfo内部使用TIOCGWINSZ ioctl作为屏幕尺寸.

或者,如user83510所述,highline的system_extensions也可以:

require 'highline'
HighLine::SystemExtensions.terminal_size # [columns, lines]
Run Code Online (Sandbox Code Playgroud)

stty size在Unix上,高级线路使用,以及ncurses和Windows的其他实现.

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

require 'terminfo'
Signal.trap('SIGWINCH', proc { puts TermInfo.screen_size.inspect })
Run Code Online (Sandbox Code Playgroud)

这对使用Readline的应用程序特别有用,例如irb:

Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) })
Run Code Online (Sandbox Code Playgroud)


Bri*_*aro 43

有一个常见的unix命令:

tput cols
Run Code Online (Sandbox Code Playgroud)

这将返回终端的宽度.


oco*_*onn 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
Run Code Online (Sandbox Code Playgroud)

链接


cld*_*ker 9

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

另请查看highline中的system_extensions文件


Nés*_*uez 7

    require 'io/console'
    puts "Rows by columns: #{IO.console.winsize}"
    puts "Ruby 2.6.4"
Run Code Online (Sandbox Code Playgroud)

  • 提供的答案被标记为低质量帖子以供审核。以下是[如何写出好的答案?](https://stackoverflow.com/help/how-to-answer) 的一些指南。这个提供的答案可能是正确的,但它可能会受益于解释。仅代码答案不被视为“好”答案。来自[评论](https://stackoverflow.com/review)。 (4认同)

dei*_*i79 5

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


Tom*_*pin 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
Run Code Online (Sandbox Code Playgroud)

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

  • 更新:从ruby 2.1+开始,curses不再是标准库的一部分.它现在已经变成了自己的宝石.请参阅:https://bugs.ruby-lang.org/issues/8584 (5认同)