How to get the width of terminal window in Ruby

前端 未结 9 1482
你的背包
你的背包 2021-01-30 16:30

Have you ever noticed that if you run rake -T in rails the list of rake descriptions are truncated by the width of the terminal window. So there should be a way to get it in Rub

相关标签:
9条回答
  • 2021-01-30 16:53

    I've found that on Ubuntu, none of the other methods specified here (ENV['COLUMNS'], tput columns or hirb) give the correct result if the terminal is resized while the Ruby application is running. This is not an issue for scripts, but it is an issue for interactive consoles, such as irb.

    The ruby-terminfo gem is the best solution I've find so far to give the correct dimensions after a resize, but it requires that you install an additional gem, and is unix-specific.

    The gem's usage is simple:

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

    TermInfo internally uses TIOCGWINSZ ioctl for the screen size.

    Alternatively, as mentioned by user83510, highline's system_extensions also works:

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

    Interally, highline uses stty size on Unix, and other implementations for ncurses and Windows.

    To listen for changes to the terminal size (instead of polling), we can trap the SIGWINCH signal:

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

    This is specifically useful for applications using Readline, such as irb:

    Signal.trap('SIGWINCH', proc { Readline.set_screen_size(TermInfo.screen_size[0], TermInfo.screen_size[1]) })
    
    0 讨论(0)
  • 2021-01-30 16:57

    ENV['COLUMNS'] will give you the number of columns in the terminal.

    0 讨论(0)
  • 2021-01-30 17:01

    There is a common unix command:

    tput cols
    

    This returns the width of the terminal.

    0 讨论(0)
  • 2021-01-30 17:03

    I'm a bit late but in rake tasks I do the following: Rake.application.terminal_width

    0 讨论(0)
  • 2021-01-30 17:04
    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
    

    Link

    0 讨论(0)
  • 2021-01-30 17:12
        require 'io/console'
        puts "Rows by columns: #{IO.console.winsize}"
        puts "Ruby 2.6.4"
    
    0 讨论(0)
提交回复
热议问题