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が間違っておりました。再度取り直しました。