Я обнаружил, что в Ubuntu ни один из других методов, указанных здесь (ENV['COLUMNS']
, tput columns
или hirb), не дает правильного результата, если размер терминала изменяется во время работы приложения Ruby. Это не проблема для скриптов, но это проблема для интерактивных консолей, таких как irb.
Gem ruby-terminfo - лучшее решение, которое я нашел до сих пор, чтобы дать правильные размеры после изменения размера, но для этого требуется установить дополнительный гем, и это зависит от unix.
Использование драгоценного камня просто:
require 'terminfo'
p TermInfo.screen_size # [lines, columns]
TermInfo внутренне использует TIOCGWINSZ ioctl для размера экрана.
В качестве альтернативы, как упомянуто пользователем 83510, system_extensions highline также работает:
require 'highline'
HighLine::SystemExtensions.terminal_size # [columns, lines]
В целом, Highline использует stty size
в Unix и других реализациях для 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]) })