he encontrado que en Ubuntu, ninguno de los otros métodos especificados aquí (ENV['COLUMNS']
, tput columns
o hirb) dan el resultado correcto si el terminal se redimensiona mientras se está ejecutando la aplicación Ruby. Esto no es un problema para los scripts, pero es un problema para las consolas interactivas, como irb.
La ruby-terminfo gem es la mejor solución que he encontrado hasta ahora para dar las dimensiones correctas después de un cambio de tamaño, pero requiere que instale una gema adicional, y es específica para unix.
el uso de la gema es simple:
require 'terminfo'
p TermInfo.screen_size # [lines, columns]
TERMINFO utiliza internamente TIOCGWINSZ ioctl para el tamaño de la pantalla.
Por otra parte, como se ha mencionado por user83510, system_extensions de highline también funciona:
require 'highline'
HighLine::SystemExtensions.terminal_size # [columns, lines]
Interally, highline utiliza stty size
en Unix, y otras implementaciones para ncurses y de Windows.
para escuchar los cambios en el tamaño del terminal (en lugar de sondeo), que pueden atrapar la señal SIGWINCH:
require 'terminfo'
Signal.trap('SIGWINCH', proc { puts TermInfo.screen_size.inspect })
Esto es especialmente útil para aplicaciones que utilizan Readline, tales como IRB:
Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) })
Debajo del capó ruby-terminfo está haciendo una llamada a 'ioctl' con' TIOCGWINSZ' y una estructura de 4 cortos sin firmar. Estas son las columnas, filas y x, y en píxeles. Aquí hay una esencia de esto directamente https://gist.github.com/nixpulvis/6025433. –
Para cualquiera que todavía esté llegando a esta página, otra gema más liviana que hace eso es https://github.com/rking/terminal-size – DannyB