您是否注意到如果在rails中运行rake -T,则rake描述列表会被终端窗口的宽度截断。所以应该有一种方法可以在Ruby中使用它并使用它。
我正在屏幕上打印一些Ascii-art,我不希望它被打破。因此我需要在运行时找出终端的宽度。
任何想法如何做到这一点?
答案 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
答案 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