Skip to content

Instantly share code, notes, and snippets.

@juvenn
Created January 30, 2010 14:27
Show Gist options
  • Save juvenn/290571 to your computer and use it in GitHub Desktop.
Save juvenn/290571 to your computer and use it in GitHub Desktop.
powerful irb with fastri
#!/usr/bin/ruby
# http://eigenclass.org/hiki/irb+ri+completion
#
require 'irb/completion'
ARGV.concat [ "--readline", "--prompt-mode", "simple" ]
module Kernel
def r(arg)
puts `qri "#{arg}"`
end
private :r
end
class Object
def puts_ri_documentation_for(obj, meth)
case self
when Module
candidates = ancestors.map{|klass| "#{klass}::#{meth}"}
candidates.concat(class << self; ancestors end.map{|k| "#{k}##{meth}"})
else
candidates = self.class.ancestors.map{|klass| "#{klass}##{meth}"}
end
candidates.each do |candidate|
#puts "TRYING #{candidate}"
desc = `qri '#{candidate}'`
unless desc.chomp == "nil"
# uncomment to use ri (and some patience)
#desc = `ri -T '#{candidate}' 2>/dev/null`
#unless desc.empty?
puts desc
return true
end
end
false
end
private :puts_ri_documentation_for
def method_missing(meth, *args, &block)
if md = /ri_(.*)/.match(meth.to_s)
unless puts_ri_documentation_for(self,md[1])
"Ri doesn't know about ##{meth}"
end
else
super
end
end
def ri_(meth)
unless puts_ri_documentation_for(self,meth.to_s)
"Ri doesn't know about ##{meth}"
end
end
end
RICompletionProc = proc{|input|
bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
case input
when /(\s*(.*)\.ri_)(.*)/
pre = $1
receiver = $2
meth = $3 ? /\A#{Regexp.quote($3)}/ : /./ #}
begin
candidates = eval("#{receiver}.methods", bind).map do |m|
case m
when /[A-Za-z_]/; m
else # needs escaping
%{"#{m}"}
end
end
candidates = candidates.grep(meth)
candidates.map{|s| pre + s }
rescue Exception
candidates = []
end
when /([A-Z]\w+)#(\w*)/ #}
klass = $1
meth = $2 ? /\A#{Regexp.quote($2)}/ : /./
candidates = eval("#{klass}.instance_methods(false)", bind)
candidates = candidates.grep(meth)
candidates.map{|s| "'" + klass + '#' + s + "'"}
else
IRB::InputCompletor::CompletionProc.call(input)
end
}
#Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
Readline.basic_word_break_characters= " \t\n\\><=;|&"
Readline.completion_proc = RICompletionProc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment