您是否注意到,在Rails中运行rake -T时,rake描述列表会因终端窗口的宽度而被截断。因此,应该有一种方法在Ruby中获取并使用它。
我正在屏幕上打印一些ASCII艺术品,我不希望它被打破。因此,我需要找出终端的宽度,以便在运行时进行某种操作。
有任何想法如何实现吗?
有一个常见的Unix命令:
tput cols
这会返回终端的宽度。
我发现在Ubuntu上,如果当Ruby应用程序正在运行时调整终端大小,则此处指定的其他方法(ENV['COLUMNS']
、tput columns
或hirb
)都无法给出正确的结果。对于脚本而言这不是问题,但对于交互式控制台,如irb,则是一个问题。
ruby-terminfo gem是我目前找到的最好的解决方案,可以在调整终端大小后提供正确的尺寸,但需要您安装一个附加的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上使用其他实现。
要监听终端大小的更改(而不是轮询),我们可以捕获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]) })
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
require 'io/console'
puts "Rows by columns: #{IO.console.winsize}"
puts "Ruby 2.6.4"
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
。我有点晚了,但在rake任务中我会这样做:Rake.application.terminal_width
该代码片段用于获取当前终端的宽度。ENV['COLUMNS']可以获取终端中的列数。
tput cols
可以工作。 - Meckirequire 'tty-screen'
TTY::Screen.size # => [51, 280]
TTY::Screen.width # => 280
TTY::Screen.height # => 51
ioctl
调用和4个无符号短结构体的TIOCGWINSZ
。这些是列,行以及像素中的x,y。这里是直接链接的要点 https://gist.github.com/nixpulvis/6025433。 - Nathan Lilienthaltput cols
而不是tput columns
。 - Meckihighline
,所以我想尝试那个解决方案...但是当我这样做时,我会得到:NameError(错误的颜色或未初始化的常量SystemExtensions)
--是否需要安装其他附加的gem? 此外,正如已经提到的那样,它是tput cols
而不是tput columns
,在ubuntu下对我有用。 但是标准库的解决方案更好,因此我选择了在这里列出的io/console
答案。 - lindes