ri-emacs.rbを1.9.1で動くようにしてみる。
ri-rubyでriを引けないので、せっかくEmacs上で色々できるはずが快適になら
ないので、Rubyを始めたばかりの素人がri-emacsを1.9.1で動くようにしてみ
ます。
・・・というわけで修正してみました。diff -cの結果は次のような感じです。
*** ri-emacs.rb 2009-06-28 10:52:58.628142973 +0900 --- ri-emacs.rb.orig 2007-01-15 01:00:36.000000000 +0900 *************** *** 44,50 **** end def ruby_minimum_version?(*version) ! RUBY_VERSION.split("."). map{ |i| i.to_i }. <=>(version) > -1 end --- 44,50 ---- end def ruby_minimum_version?(*version) ! VERSION.split("."). map{ |i| i.to_i }. <=>(version) > -1 end *************** *** 56,85 **** options = Options.new options.use_stdout = true ! options.formatter = RDoc::RI::Formatter.for("ansi") options.width = 72 if ruby_minimum_version?(1, 8, 5) begin require 'rubygems' Dir["#{Gem.path}/doc/*/ri"].each do |path| ! RDoc::RI::Paths::PATH << path end rescue LoadError end end ! paths = paths || RDoc::RI::Paths::path(1,1,1,1) ! @ri_reader = RDoc::RI::Reader.new(RDoc::RI::Cache.new(paths)) ! @display = RDoc::RI::DefaultDisplay.new(options.formatter, options.width, ! options.use_stdout) end def lookup_keyw(keyw) begin ! desc = RDoc::RI::NameDescriptor.new(keyw) ! rescue RDoc::RI::Error => e return nil end --- 56,84 ---- options = Options.new options.use_stdout = true ! options.formatter = RI::TextFormatter.for("ansi") options.width = 72 if ruby_minimum_version?(1, 8, 5) begin require 'rubygems' Dir["#{Gem.path}/doc/*/ri"].each do |path| ! RI::Paths::PATH << path end rescue LoadError end end ! paths = paths || RI::Paths::PATH ! @ri_reader = RI::RiReader.new(RI::RiCache.new(paths)) ! @display = RiDisplay.new(options) end def lookup_keyw(keyw) begin ! desc = NameDescriptor.new(keyw) ! rescue RiError => e return nil end *************** *** 95,112 **** if [?., ?:, ?#].include? keyw[-1] namespaces = @ri_reader.lookup_namespace_in("", container) is_class_method = case keyw[-1] ! when ?. ! nil ! when ?: ! true ! when ?# ! false end methods = @ri_reader.find_methods("", is_class_method, container) return nil if methods.empty? && namespaces.empty? else ! class_name = desc.class_names.last namespaces = last_space.find_all{ |n| n.name.index(class_name).zero? } return nil if namespaces.empty? methods = [] --- 94,108 ---- if [?., ?:, ?#].include? keyw[-1] namespaces = @ri_reader.lookup_namespace_in("", container) is_class_method = case keyw[-1] ! when ?.: nil ! when ?:: true ! when ?#: false end methods = @ri_reader.find_methods("", is_class_method, container) return nil if methods.empty? && namespaces.empty? else ! #class_name = desc.class_names.last namespaces = last_space.find_all{ |n| n.name.index(class_name).zero? } return nil if namespaces.empty? methods = [] *************** *** 197,205 **** namespaces = namespaces.find_all { |n| n.full_name == desc.full_class_name } return false if namespaces.empty? klass = @ri_reader.get_class(namespaces[0]) ! @display.display_class_info(klass) end ! return true end --- 193,201 ---- namespaces = namespaces.find_all { |n| n.full_name == desc.full_class_name } return false if namespaces.empty? klass = @ri_reader.get_class(namespaces[0]) ! @display.display_class_info(klass, @ri_reader) end ! return true end *************** *** 311,316 **** else cmd = Command.new(RiEmacs.new(arg)) STDOUT.puts 'READY' ! STDOUT.flush loop { cmd.read_next } end --- 307,312 ---- else cmd = Command.new(RiEmacs.new(arg)) STDOUT.puts 'READY' ! STDOUT.flush loop { cmd.read_next } end
肝としては、1.9.1から(1.8.7とか1.8.6とかは使ったことないので知りません)、
RiPathとかが、RDoc::RI::Pathとかに変更されたこと。
他のインターフェースとかは一緒のようでしたんで、これをpatchで当てれば
動くかと。
だがしかし。
これだけじゃrcodetoolsは快適には動いてくれません。せっかくのfastriが満
足に動作してくれないため、同様の修正を施します。
修正前後を取っていない(!)ため、変更のポイントだけを。
- ::RIとかなっている部分を、RDoc::RIに置換する。
- RI::Ri〜となっている部分を、RRoc::RI::に置換する。
- fastri/ri_index.rbの237行付近、RDoc::RI::Path.new(path)の(path)を([path])にする。
ri_index.rb、ri_service.rb、fastri-serverで同様の修正を施すと、なんと
か動くようになってくれます。
でもfastri-server -Bでなんかエラーが出てる。うん、とりあえずいいや。
追記:patchが間違っておりました。再度取り直しました。