J'ai trouvé que sur Ubuntu, aucune des autres méthodes mentionnées ici (ENV['COLUMNS']
, tput columns
ou hirb) donne le résultat correct si le terminal est redimensionné tandis que l'application Ruby est en cours d'exécution. Ce n'est pas un problème pour les scripts, mais c'est un problème pour les consoles interactives, telles que la cisr.
Le rubis-terminfo gem est la meilleure solution que j'ai trouver jusqu'à présent pour donner les bonnes dimensions, après un redimensionnement, mais il nécessite l'installation d'un joyau supplémentaire, et est unix spécifiques.
Le gem est l'utilisation est simple:
require 'terminfo'
p TermInfo.screen_size # [lines, columns]
TermInfo utilise en interne TIOCGWINSZ ioctl pour la taille de l'écran.
Sinon, comme l'a mentionné user83510, highline est system_extensions fonctionne aussi:
require 'highline'
HighLine::SystemExtensions.terminal_size # [columns, lines]
Interally, highline utilise stty size
sur Unix, et d'autres implémentations de ncurses et Windows.
Pour écouter des modifications à la taille du terminal (à la place de bureaux de vote), on peut piéger le signal SIGWINCH:
require 'terminfo'
Signal.trap('SIGWINCH', proc { puts TermInfo.screen_size.inspect })
Ceci est particulièrement utile pour les applications à l'aide de Readline, tels que la cisr:
Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) })