2013-01-30 22:14:06 -05:00
|
|
|
class Pry::Terminal
|
|
|
|
class << self
|
|
|
|
# Return a pair of [rows, columns] which gives the size of the window.
|
|
|
|
#
|
|
|
|
# If the window size cannot be determined, return nil.
|
|
|
|
def screen_size
|
|
|
|
rows, cols = actual_screen_size
|
|
|
|
if rows && cols
|
|
|
|
[rows.to_i, cols.to_i]
|
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Return a screen size or a default if that fails.
|
2013-02-07 22:30:20 -05:00
|
|
|
def size! default = [27, 80]
|
2013-01-30 22:14:06 -05:00
|
|
|
screen_size || default
|
|
|
|
end
|
|
|
|
|
|
|
|
# Return a screen width or the default if that fails.
|
2013-02-07 22:30:20 -05:00
|
|
|
def width!
|
2013-01-30 22:14:06 -05:00
|
|
|
size![1]
|
|
|
|
end
|
|
|
|
|
2013-02-07 22:30:20 -05:00
|
|
|
# Return a screen height or the default if that fails.
|
|
|
|
def height!
|
|
|
|
size![0]
|
|
|
|
end
|
|
|
|
|
2013-01-30 22:14:06 -05:00
|
|
|
def actual_screen_size
|
|
|
|
# The best way, if possible (requires non-jruby ≥1.9 or io-console gem)
|
|
|
|
screen_size_according_to_io_console or
|
|
|
|
# Fall back to the old standby, though it might be stale:
|
|
|
|
screen_size_according_to_env or
|
|
|
|
# Fall further back, though this one is also out of date without something
|
|
|
|
# calling Readline.set_screen_size
|
|
|
|
screen_size_according_to_readline or
|
|
|
|
# Windows users can otherwise run ansicon and get a decent answer:
|
|
|
|
screen_size_according_to_ansicon_env
|
|
|
|
end
|
|
|
|
|
|
|
|
def screen_size_according_to_io_console
|
|
|
|
return if Pry::Helpers::BaseHelpers.jruby?
|
|
|
|
require 'io/console'
|
|
|
|
$stdout.winsize if $stdout.tty? and $stdout.respond_to?(:winsize)
|
|
|
|
rescue LoadError
|
|
|
|
# They're probably on 1.8 without the io-console gem. We'll keep trying.
|
|
|
|
end
|
|
|
|
|
|
|
|
def screen_size_according_to_env
|
|
|
|
size = [ENV['LINES'] || ENV['ROWS'], ENV['COLUMNS']]
|
2013-02-04 10:29:09 -05:00
|
|
|
size if nonzero_column?(size)
|
2013-01-30 22:14:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def screen_size_according_to_readline
|
2013-02-04 10:29:09 -05:00
|
|
|
if Readline.respond_to?(:get_screen_size)
|
|
|
|
size = Readline.get_screen_size
|
|
|
|
size if nonzero_column?(size)
|
|
|
|
end
|
2013-01-30 22:14:06 -05:00
|
|
|
rescue Java::JavaLang::NullPointerException
|
|
|
|
# This rescue won't happen on jrubies later than:
|
|
|
|
# https://github.com/jruby/jruby/pull/436
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def screen_size_according_to_ansicon_env
|
|
|
|
return unless ENV['ANSICON'] =~ /\((.*)x(.*)\)/
|
|
|
|
size = [$2, $1]
|
2013-02-04 10:29:09 -05:00
|
|
|
size if nonzero_column?(size)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def nonzero_column?(size)
|
|
|
|
size[1].to_i > 0
|
2013-01-30 22:14:06 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|