Как узнать ширину окна терминала в Ruby - PullRequest
44 голосов
/ 15 января 2010

Вы когда-нибудь замечали, что если вы запускаете rake -T в rails, список описаний rake усекается по ширине окна терминала. Так что должен быть способ получить его в Ruby и использовать его.

Я печатаю на экране немного Ascii-art, и я не хочу, чтобы он сломался. поэтому мне нужно узнать ширину терминала во время выполнения, как-то.

Есть идеи, как это сделать?

Ответы [ 8 ]

45 голосов
/ 04 мая 2012

Я обнаружил, что в Ubuntu ни один из других методов, указанных здесь (ENV['COLUMNS'], tput columns или hirb), не дает правильного результата, если размер терминала изменяется во время работы приложения Ruby. Это не проблема для скриптов, но это проблема для интерактивных консолей, таких как irb.

Gem ruby-terminfo - лучшее решение, которое я нашел до сих пор, чтобы дать правильные размеры после изменения размера, но для этого требуется установить дополнительный гем, и это зависит от unix.

Использование драгоценного камня просто:

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

TermInfo внутренне использует TIOCGWINSZ ioctl для размера экрана.

В качестве альтернативы, как упомянуто пользователем 83510, system_extensions highline также работает:

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

В целом, Highline использует stty size в Unix и других реализациях для ncurses и Windows.

Чтобы прослушивать изменения размера терминала (вместо опроса), мы можем перехватить сигнал SIGWINCH:

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

Это особенно полезно для приложений, использующих Readline, таких как irb:

Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) })
43 голосов
/ 15 января 2010

Существует общая команда unix:

tput cols

Возвращает ширину терминала.

26 голосов
/ 24 января 2014
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

Ссылка

9 голосов
/ 16 января 2010

Если вы хотите, чтобы ваш код работал на разных платформах, вот что я использую: http://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71

Также проверьте файл system_extensions в highline

5 голосов
/ 04 июля 2013

Ruby на самом деле поставляется со встроенным классом Curses, который позволяет вам делать все с помощью окна терминала.

Например, вы можете сделать это:

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

Для получения дополнительной информации: http://ruby -doc.org / stdlib-1.9.3 / libdoc / curses / rdoc / Curses / Window.html

5 голосов
/ 10 июня 2012

Я немного опоздал, но в задачах с граблями я делаю следующее: Rake.application.terminal_width

3 голосов
/ 15 января 2010

ENV ['COLUMNS'] даст вам количество столбцов в терминале.

1 голос
/ 12 декабря 2018

Я написал гем tty-screen для определения размера терминала в разных ОС и интерпретаторах Ruby. Он охватывает множество способов проверки размера, включая Win API для Windows, Java-библиотеки для JRuby и утилиты Unix.

Это модуль, который вы можете включить в свой класс или позвонить напрямую:

require 'tty-screen'

TTY::Screen.size     # => [51, 280]
TTY::Screen.width    # => 280
TTY::Screen.height   # => 51

Подробнее см .: https://github.com/piotrmurach/tty-screen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...