2010-01-15 20 views
40

Avete mai notato che se si esegue rake -T in rails l'elenco delle descrizioni del rake viene troncato dalla larghezza della finestra del terminale. Quindi dovrebbe esserci un modo per farlo entrare in Ruby e usarlo.Come ottenere la larghezza della finestra del terminale in Ruby

Sto stampando alcuni Ascii-art sullo schermo e non voglio che si rompa. quindi ho bisogno di scoprire la larghezza del terminale in fase di esecuzione un po 'come.

Qualche idea su come farlo?

risposta

43

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]) }) 
+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. –

+0

Per chi ancora arriva a questa pagina, un altro gioiello più leggero che lo fa è https://github.com/rking/terminal-size – DannyB

3

ENV ['COLONNE'] ti darà il numero di colonne nel terminale.

+0

ho provato in IRB e ispezionato l'hash ENV, ma non riusciva a trovare la chiave delle colonne. –

+0

Questo trucco deve essere specifico per alcune shell o sistemi operativi. Non ha funzionato neanche con Bash su Debian. –

+0

Interessante, funziona su OSX almeno. –

38

c'è un comando unix comune:

tput cols 

Questo restituisce la larghezza del terminale.

+0

Grazie, questo funziona. –

+0

\ '/ usr/bin/env tput cols \' .to_i funziona alla grande per me. – donatJ

4

sono un po 'in ritardo, ma in compiti rake faccio la seguente: Rake.application.terminal_width

+0

Ottima risposta, grazie mille! Ne avevo bisogno in particolare in un compito di Rake. Aggiornamento –

5

rubino in realtà viene fornito con un built-in classe denominata "maledizioni", che le fai tutti i tipi di cose con la finestra del terminale.

Ad esempio, si può fare questo:

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 

Per maggiori informazioni: http://ruby-doc.org/stdlib-1.9.3/libdoc/curses/rdoc/Curses/Window.html

+4

: a partire da ruby ​​2.1+, curses non fa più parte della libreria standard. Ora è stato spostato nella sua gemma. Vedi: https://bugs.ruby-lang.org/issues/8584 –

22
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 

Link

Problemi correlati