1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# load libraries
require 'rubygems'
require 'wirble'

# start wirble (with color)
Wirble.init
Wirble.colorize


def history(how_many = 50)
  history_size = Readline::HISTORY.size

  # no lines, get out of here
  puts "No history" and return if history_size == 0

  start_index = 0

  # not enough lines, only show what we have
  if history_size <= how_many
    how_many  = history_size - 1
    end_index = how_many
  else
    end_index = history_size - 1 # -1 to adjust for array offset
    start_index = end_index - how_many 
  end

  start_index.upto(end_index) {|i| print_line i}
  nil
end
alias :h  :history

# -2 because -1 is ourself
def history_do(lines = (Readline::HISTORY.size - 2))
  irb_eval lines
  nil
end 
alias :h! :history_do

def history_write(filename, lines)
  file = File.open(filename, 'w')

  get_lines(lines).each do |l|
    file << "#{l}\n"
  end

  file.close
end
alias :hw :history_write

private
def get_line(line_number)
  Readline::HISTORY[line_number]
end

def get_lines(lines = [])
  return [get_line(lines)] if lines.is_a? Fixnum

  out = []

  lines = lines.to_a if lines.is_a? Range

  lines.each do |l|
    out << Readline::HISTORY[l]
  end

  return out
end

def print_line(line_number, show_line_numbers = true)
  print "[%04d] " % line_number if show_line_numbers
  puts get_line(line_number)
end

def irb_eval(lines)
  to_eval = get_lines(lines)

  eval to_eval.join("\n")

  to_eval.each {|l| Readline::HISTORY << l}
end

def benchmark
  cur = Time.now
  result = yield
  print "#{cur = Time.now - cur} seconds"
  puts " (#{(cur / $last_benchmark * 100).to_i - 100}% change)" rescue puts ""
  $last_benchmark = cur
  result
end

##
# From http://www.notsostupid.com/blog/2006/11/09/pm-print-methods/

#ANSI_RESET        = '' # "