I'm not very bright today. I sent a previous version of the message. Here
is the version I meant to send.

I wrote a quick little hack to add buffers to irb. This reminds me of the
editing environment in the good ol' days.

Here's how it works:

    irb(main):274:0> load 'irbide'
    true
    irb(main):276:0> a = IRBIDE.new
    Newly created environment. No buffers exist
    irb(main):277:0> a.add 'test', 'Prints out "hello"'
    "New buffer test created"
    irb(main):278:0> a.add 'greet', 'Takes a name as a string argument and says
    hello'
    "New buffer greet created"
    irb(main):279:0> a
      test: Prints out "hello"
      greet: Takes a name as a string argument and says hello
    irb(main):280:0> a.rename 'test', 'hello'
      hello: Prints out "hello"
      greet: Takes a name as a string argument and says hello
    irb(main):281:0> a.edit 'hello'
    class Test
      def greet
        puts "hello world"
      end
    end
    nil
    irb(main):282:0> a.description 'hello', 'Prints out "hello world"'
      hello: Prints out "hello world"
      greet: Takes a name as a string argument and says hello
    irb(main):283:0> a.cat 'greet'

    nil
    irb(main):284:0> a.delete 'greet'
      hello: Prints out "hello world"

Whatever you edit in the buffers is immediately loaded into irb when you
exit. Try "Test.new.greet". You can do "a.help" as well.

Here's the source code. It's not good enough for public use, but if there's
no interest from other people then I'll know not to expend the effort to
polish it up other than to add stuff for myself. :)

Save this as "irbide" and use the load command shown at the top. You will
probably want to change "joe" to "emacs" or "vi", depending on your
religious persuasion.

    require "tempfile"

    class IRBIDE
      def initialize
        @list = {}
      end

      def add name, description="Lazy Me", text=""
        @list[name] = [ description, text ]
        "New buffer #{name} created"
      end

      def inspect
        result = ""
        @list.each do |i, j|
          result += "  #{i}: #{j[0]}\n"
        end
        if result.empty?
          "Newly created environment. No buffers exist"
        else
          result.chomp
        end
      end

      def list
        print inspect
      end

      def rename oldname, newname
        @list[newname] = @list[oldname]
        @list.delete oldname
        self
      end

      def description name, description="Stupid Me"
        @list[name][0] = description
        self
      end

      def edit name
        tf = Tempfile.new(name)
        tf.write(@list[name][1])
        tf.close

        system "joe " + tf.path

        load tf.path

        tf.open
        @list[name][1] = tf.read
        tf.close

        puts @list[name][1]
      end

      def cat name
        puts @list[name][1]
      end

      def delete name
        @list.delete name
        self
      end

      def help
        puts <<-end
          IRBIDE: Adds editable buffers to irb.

          a = IRBIDE.new
          a.add 'test', 'Prints out "hello"'
          a.add 'greet', 'Takes a name as a string argument and says hello'
          a   (or a.list)

          a.rename 'test', 'hello'
          a.edit 'hello'
          a.description 'hello', 'Prints out "hello world"'

          a.cat 'greet'
          a.delete 'greet'
        end
      end
    end

-- 
  spwhite / chariot.net.au