class IRB::ExtendCommand::Ls::Output

def col_widths(strs, cols:)

def col_widths(strs, cols:)
  cols.times.map do |col|
    (col...strs.size).step(cols).map do |i|
      strs[i].length
    end.max
  end
end

def dump(name, strs)

def dump(name, strs)
  strs = strs.grep(@grep) if @grep
  strs = strs.sort
  return if strs.empty?
  # Attempt a single line
  @io.print "#{Color.colorize(name, [:BOLD, :BLUE])}: "
  if fits_on_line?(strs, cols: strs.size, offset: "#{name}: ".length)
    @io.puts strs.join(MARGIN)
    return
  end
  @io.puts
  # Dump with the largest # of columns that fits on a line
  cols = strs.size
  until fits_on_line?(strs, cols: cols, offset: MARGIN.length) || cols == 1
    cols -= 1
  end
  widths = col_widths(strs, cols: cols)
  strs.each_slice(cols) do |ss|
    @io.puts ss.map.with_index { |s, i| "#{MARGIN}%-#{widths[i]}s" % s }.join
  end
end

def fits_on_line?(strs, cols:, offset: 0)

def fits_on_line?(strs, cols:, offset: 0)
  width = col_widths(strs, cols: cols).sum + MARGIN.length * (cols - 1)
  width <= @line_width - offset
end

def initialize(grep: nil)

def initialize(grep: nil)
  @grep = grep
  @line_width = screen_width - MARGIN.length # right padding
  @io = StringIO.new
end

def print_result

def print_result
  Pager.page_content(@io.string)
end

def screen_width

def screen_width
  Reline.get_screen_size.last
rescue Errno::EINVAL # in `winsize': Invalid argument - <STDIN>
  80
end