Ho scoperto che su Ubuntu, nessuno degli altri metodi specificati Qui (ENV['COLUMNS']
, tput columns
o hirb) si ottiene il risultato corretto se il terminale viene ridimensionato mentre l'applicazione Ruby è in esecuzione. Questo non è un problema per gli script, ma è un problema per le console interattive, come ad esempio irb.
Il ruby-terminfo gem è la soluzione migliore che ho trovato finora per dare le dimensioni corrette dopo un ridimensionamento, ma è necessario installare un gioiello in più, ed è unix-specifica.
utilizzo del gioiello è semplice:
require 'terminfo'
p TermInfo.screen_size # [lines, columns]
TERMINFO utilizza internamente TIOCGWINSZ ioctl per le dimensioni dello schermo.
In alternativa, come detto da user83510, system_extensions di Highline funziona anche:
require 'highline'
HighLine::SystemExtensions.terminal_size # [columns, lines]
Interally, highline utilizza stty size
su Unix, e altre implementazioni di ncurses e di Windows.
Per intercettare modifiche alle dimensioni terminale (invece di polling), si può intercettare il segnale SIGWINCH:
require 'terminfo'
Signal.trap('SIGWINCH', proc { puts TermInfo.screen_size.inspect })
Questo è particolarmente utile per applicazioni che utilizzano Readline, come irb:
Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) })
Sotto il cofano ruby-terminfo sta facendo una chiamata a 'ioctl' con' TIOCGWINSZ' e una struttura di 4 cortometraggi senza segno. Queste sono le colonne, le righe e x, y in pixel. Ecco un esempio di questo direttamente https://gist.github.com/nixpulvis/6025433. –
Per chi ancora arriva a questa pagina, un altro gioiello più leggero che lo fa è https://github.com/rking/terminal-size – DannyB