49 votes

Comment obtenir la largeur de la fenêtre de terminal en Ruby

Avez-vous remarqué que si vous exécutez râteau -T dans les rails de la liste de râteau descriptions sont tronqués par la largeur de la fenêtre de terminal. Donc il devrait y avoir une façon de l'obtenir dans le Rubis et l'Utiliser.

Je suis d'impression Ascii-art sur l'écran et je ne veux pas être brisé. donc j'ai besoin de savoir la largeur du terminal au moment de l'exécution de certains comment.

Aucune Idée de comment faire cela?

47voto

Brian Gianforcaro Points 11985

Leur est une commune de la commande unix:

tput cols

De retour à la largeur du terminal.

45voto

Ralf Points 3732

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]) })

35voto

oconn Points 142
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

Lien

9voto

user83510 Points 3885

Si vous voulez que votre code fonctionne sur les plates-formes, voici ce que j'utilise: http://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71

Découvrez également les system_extensions fichier en highline

5voto

Tom Chapin Points 336

Ruby s'agit en réalité d'une classe appelée "Malédictions", qui permet de faire toutes sortes de choses avec la fenêtre de terminal.

Par exemple, vous pouvez faire ceci:

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

Pour plus d'info: http://ruby-doc.org/stdlib-1.9.3/libdoc/curses/rdoc/Curses/Window.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X