Как получить ширину окна терминала в Ruby
Вы когда-нибудь замечали, что если вы используете rake -T в рельсах, список описаний грабли усекается по ширине окна терминала. Поэтому должен быть способ получить его в Ruby и использовать его.
Я печатаю на экране какое-то искусство Ascii, и я не хочу, чтобы он был сломан. поэтому мне нужно выяснить ширину терминала во время выполнения.
Любая идея, как это сделать?
Ответы
Ответ 1
Я обнаружил, что в Ubuntu ни один из других методов, указанных здесь (ENV['COLUMNS']
, tput columns
или hirb), не дает правильного результата, если размер терминала изменяется при запуске приложения Ruby. Это не проблема для скриптов, но это проблема для интерактивных консолей, таких как irb.
ruby-terminfo gem - лучшее решение, которое я нашел до сих пор, чтобы дать правильные размеры после изменения размера, но для этого требуется, чтобы вы устанавливаете дополнительный жемчуг и определенно unix.
Использование драгоценных камней прост:
require 'terminfo'
p TermInfo.screen_size # [lines, columns]
TermInfo внутренне использует TIOCGWINSZ ioctl для размера экрана.
В качестве альтернативы, как упоминалось пользователем83510, highline system_extensions также работает:
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]) })
Ответ 2
Существует общая команда unix:
tput cols
Это возвращает ширину терминала.
Ответ 3
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
Ссылка
Ответ 4
Если вы хотите, чтобы ваш код работал на разных платформах, вот что я использую: http://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61-71
Также проверьте файл system_extensions в highline
Ответ 5
Я немного опаздываю, но в rake-задачах я делаю следующее: Rake.application.terminal_width
Ответ 6
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
Ответ 7
ENV ['COLUMNS'] предоставит вам количество столбцов в терминале.
Ответ 8
Я написал гем 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
Ответ 9
require 'io/console'
puts "Rows by columns: #{IO.console.winsize}"
puts "Ruby 2.6.4"