Skip to content

Instantly share code, notes, and snippets.

@indirect
Created February 3, 2011 19:32
Show Gist options
  • Save indirect/810016 to your computer and use it in GitHub Desktop.
Save indirect/810016 to your computer and use it in GitHub Desktop.
Bleything's IRB history hacks
# Ben Bleything's IRB history hacks
# from RubyConf 2007, 2-4 November
# Lists the last how_many lines of history (defaults to 50). Aliased to h.
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
# replay lines from history. Aliased to h!
#
# h! by itself will replay the most recent line. You can also pass in a
# range, array, or any mixture of the three.
#
# We subtract 2 from HISTORY.size because -1 is the command we just issued.
def history_do( *lines )
lines = [Readline::HISTORY.size - 2] if lines.empty?
to_eval = get_lines( lines )
to_eval.each {|l| Readline::HISTORY << l}
IRB.CurrentContext.workspace.evaluate self, to_eval.join(';')
end
alias :h! :history_do
# writes history to a named file. This is useful if you want to show somebody
# something you did in irb, or for rapid prototyping. Aliased to hw.
#
# Uses similar calling semantics to h!, that is, you can pass in fixnums,
# ranges, arrays, or any combination thereof.
def history_write( filename, *lines )
File.open( filename, 'w' ) do |f|
get_lines( lines ).each do |l|
f.puts l
end
end
end
alias :hw :history_write
# copies history to the OS X clipboard, for pasting into something else.
# added by Andre Arko ([email protected]) on 26 November 2007
def history_copy( *lines )
IO.popen('pbcopy', 'r+') do |clipboard|
get_lines( lines ).each do |l|
clipboard.puts l
end
end
end
alias :hc :history_copy
private
# simple getter to fetch from Readline
def get_line(line_number)
Readline::HISTORY[line_number]
end
# the code what powers the line fetcherating. Accepts an array and iterates
# over each entry, fetching that line from the history and placing it into a
# temporary array which is ultimately returned.
def get_lines( lines )
out = []
lines.each do |line|
case line
when Fixnum
out << get_line( line )
when Range
line.to_a.each do |l|
out << get_line( l )
end
end
end
return out
end
# prints out the contents of the line from history, along with a line number,
# if desired.
def print_line(line_number, show_line_numbers = true)
print "[%04d] " % line_number if show_line_numbers
puts get_line(line_number)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment