Подтвердить что ты не робот

Как получить ширину окна терминала в Ruby

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

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

Любая идея, как это сделать?

4b9b3361

Ответ 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

Ссылка

Ответ 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"