class Pry::Pager::SystemPager

buffered content.
to it. If ‘#close` is called before then, it just prints out the
page long, then invokes an external pager and starts streaming output
`SystemPager` buffers output until we’re pretty sure it’s at least a

def self.available?

def self.available?
  if @system_pager.nil?
    @system_pager =
      begin
        pager_executable = default_pager.split(' ').first
        if Helpers::Platform.windows? || Helpers::Platform.windows_ansi?
          `where /Q #{pager_executable}`
        else
          `which #{pager_executable}`
        end
        $CHILD_STATUS.success?
      rescue StandardError
        false
      end
  else
    @system_pager
  end
end

def self.default_pager

def self.default_pager
  pager = Pry::Env['PAGER'] || ''
  # Default to less, and make sure less is being passed the correct
  # options
  pager = "less -R -F -X" if pager.strip.empty? || pager =~ /^less\b/
  pager
end

def close

def close
  if invoked_pager?
    pager.close
  else
    @out.puts @buffer
  end
end

def initialize(*)

def initialize(*)
  super
  @tracker = PageTracker.new(height, width)
  @buffer  = ""
  @pager   = nil
end

def invoked_pager?

def invoked_pager?
  @pager
end

def pager

def pager
  @pager ||= IO.popen(self.class.default_pager, 'w')
end

def write(str)

def write(str)
  if invoked_pager?
    write_to_pager str
  else
    @tracker.record str
    @buffer += str
    write_to_pager @buffer if @tracker.page?
  end
rescue Errno::EPIPE
  raise StopPaging
end

def write_to_pager(text)

def write_to_pager(text)
  pager.write @out.decolorize_maybe(text)
end