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)
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)
如果您希望代码跨平台工作,请使用以下内容:http://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71
另请查看highline中的system_extensions文件
require 'io/console'
puts "Rows by columns: #{IO.console.winsize}"
puts "Ruby 2.6.4"
Run Code Online (Sandbox Code Playgroud)
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