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

Avez-vous déjà remarqué que si vous exécutez rake -T dans des rails, la liste des descriptions de rake est tronquée par la largeur de la fenêtre du terminal. Il devrait donc y avoir un moyen de l’obtenir en Ruby et de l’utiliser.

J’imprime de l’art Ascii sur l’écran et je ne veux pas que ça se brise. par conséquent, j’ai besoin de trouver la largeur du terminal à l’exécution certains comment.

Une idée comment faire ça?

J’ai trouvé que sur Ubuntu, aucune des autres méthodes spécifiées ici ( ENV['COLUMNS'] , tput columns tput ou hirb) ne donne le résultat correct si le terminal est redimensionné pendant 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 irb.

Le gem ruby-terminfo est la meilleure solution que j’ai trouvée jusqu’ici pour donner les bonnes dimensions après un redimensionnement, mais cela nécessite que vous installiez un gem supplémentaire, spécifique à Unix.

L’utilisation de la pierre est simple:

 require 'terminfo' p TermInfo.screen_size # [lines, columns] 

TermInfo utilise en interne TIOCGWINSZ ioctl pour la taille de l’écran.

Alternativement, comme mentionné par user83510, system_extensions de highline fonctionne également:

 require 'highline' HighLine::SystemExtensions.terminal_size # [columns, lines] 

En interne, highline utilise la stty size sous Unix et d’autres implémentations pour ncurses et Windows.

Pour écouter les modifications apscopes à la taille du terminal (au lieu d’interroger), nous pouvons capturer le signal SIGWINCH:

 require 'terminfo' Signal.trap('SIGWINCH', proc { puts TermInfo.screen_size.inspect }) 

Ceci est particulièrement utile pour les applications utilisant Readline, telles que irb:

 Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) }) 

Il existe une commande unix commune:

 tput cols 

Cela renvoie la largeur du terminal.

 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

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

Découvrez également le fichier system_extensions dans highline

Ruby est livré avec une classe intégrée appelée “Curses”, qui vous permet de faire toutes sortes de choses avec la fenêtre du 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’informations: http://ruby-doc.org/stdlib-1.9.3/libdoc/curses/rdoc/Curses/Window.html

Je suis un peu en retard mais dans les tâches de rake, je fais ce qui suit: Rake.application.terminal_width

ENV [‘COLUMNS’] vous donnera le nombre de colonnes dans le terminal.