# class XMP

An example printer for irb.

It’s much like the standard library `PrettyPrint`, that shows the value of each expression as it runs.

In order to use this library, you must first require it:

    require 'irb/xmp'

Now, you can take advantage of the `Object#xmp` convenience method.

    xmp <<END
      foo = "bar"
      baz = 42
    END
    #=> foo = "bar"
      #==>"bar"
    #=> baz = 42
      #==>42

You can also create an `XMP` object, with an optional binding to print expressions in the given binding:

    ctx = binding
    x = XMP.new ctx
    x.puts
    #=> today = "a good day"
      #==>"a good day"
    ctx.eval 'today # is what?'
    #=> "a good day"

### Public Class Methods

new(bind = nil) click to toggle source

Creates a new `XMP` object.

The top-level binding or, optional `bind` parameter will be used when creating the workspace. See WorkSpace.new for more information.

This uses the `:XMP` prompt mode, see Customizing the IRB Prompt at `IRB` for full detail.

    # File lib/irb/xmp.rb, line 55
    def initialize(bind = nil)
      IRB.init_config(nil)

      IRB.conf[:PROMPT_MODE] = :XMP

      bind = IRB::Frame.top(1) unless bind
      ws = IRB::WorkSpace.new(bind)
      @io = StringInputMethod.new
      @irb = IRB::Irb.new(ws, @io)
      @irb.context.ignore_sigint = false

      IRB.conf[:MAIN_CONTEXT] = @irb.context
    end

### Public Instance Methods

puts(exps) click to toggle source

Evaluates the given `exps`, for example:

    require 'irb/xmp'
    x = XMP.new

    x.puts '{:a => 1, :b => 2, :c => 3}'
    #=> {:a => 1, :b => 2, :c => 3}
      # ==>{:a=>1, :b=>2, :c=>3}
    x.puts 'foo = "bar"'
    # => foo = "bar"
      # ==>"bar"

    # File lib/irb/xmp.rb, line 80
    def puts(exps)
      @io.puts exps

      if @irb.context.ignore_sigint
        begin
          trap_proc_b = trap("SIGINT"){@irb.signal_handle}
          catch(:IRB_EXIT) do
            @irb.eval_input
          end
        ensure
          trap("SIGINT", trap_proc_b)
        end
      else
        catch(:IRB_EXIT) do
          @irb.eval_input
        end
      end
    end