# class IRB::Context

A class that wraps the current state of the irb session, including the configuration of `IRB.conf`.

### Attributes

ap_name[RW]

A copy of the default `IRB.conf[:AP_NAME]`

auto_indent_mode[RW]

Can be either the default `IRB.conf[:AUTO_INDENT]`, or the mode set by `prompt_mode=`

To disable auto-indentation in irb:

    IRB.conf[:AUTO_INDENT] = false

or

    irb_context.auto_indent_mode = false

or

    IRB.CurrentContext.auto_indent_mode = false

See Configuration at `IRB` for more information.

back_trace_limit[RW]

The limit of backtrace lines displayed as top `n` and tail `n`.

The default value is 16.

Can also be set using the `--back-trace-limit` command line option.

See Command line options at `IRB` for more command line options.

command_aliases[RW]

User-defined `IRB` command aliases

echo[RW]

Whether to echo the return value to output or not.

Uses `IRB.conf[:ECHO]` if available, or defaults to `true`.

    puts "hello"
    # hello
    #=> nil
    IRB.CurrentContext.echo = false
    puts "omg"
    # omg

echo?[RW]

Whether to echo the return value to output or not.

Uses `IRB.conf[:ECHO]` if available, or defaults to `true`.

    puts "hello"
    # hello
    #=> nil
    IRB.CurrentContext.echo = false
    puts "omg"
    # omg

echo_on_assignment[RW]

Whether to echo for assignment expressions.

If set to `false`, the value of assignment will not be shown.

If set to `true`, the value of assignment will be shown.

If set to `:truncate`, the value of assignment will be shown and truncated.

It defaults to `:truncate`.

    a = "omg"
    #=> omg

    a = "omg" * 10
    #=> omgomgomgomgomgomgomg...

    IRB.CurrentContext.echo_on_assignment = false
    a = "omg"

    IRB.CurrentContext.echo_on_assignment = true
    a = "omg" * 10
    #=> omgomgomgomgomgomgomgomgomgomg

To set the behaviour of showing on assignment in irb:

    IRB.conf[:ECHO_ON_ASSIGNMENT] = :truncate or true or false

or

    irb_context.echo_on_assignment = :truncate or true or false

or

    IRB.CurrentContext.echo_on_assignment = :truncate or true or false

echo_on_assignment?[RW]

Whether to echo for assignment expressions.

If set to `false`, the value of assignment will not be shown.

If set to `true`, the value of assignment will be shown.

If set to `:truncate`, the value of assignment will be shown and truncated.

It defaults to `:truncate`.

    a = "omg"
    #=> omg

    a = "omg" * 10
    #=> omgomgomgomgomgomgomg...

    IRB.CurrentContext.echo_on_assignment = false
    a = "omg"

    IRB.CurrentContext.echo_on_assignment = true
    a = "omg" * 10
    #=> omgomgomgomgomgomgomgomgomgomg

To set the behaviour of showing on assignment in irb:

    IRB.conf[:ECHO_ON_ASSIGNMENT] = :truncate or true or false

or

    irb_context.echo_on_assignment = :truncate or true or false

or

    IRB.CurrentContext.echo_on_assignment = :truncate or true or false

eval_history[R]

The command result history limit. This method is not available until `eval_history=` was called with non-nil value (directly or via setting `IRB.conf[:EVAL_HISTORY]` in `.irbrc`).

extra_doc_dirs[RW]

Specify the installation locations of the ri file to be displayed in the document dialog.

ignore_eof[RW]

Whether `^D` (`control-d`) will be ignored or not.

If set to `false`, `^D` will quit irb.

ignore_eof?[RW]

Whether `^D` (`control-d`) will be ignored or not.

If set to `false`, `^D` will quit irb.

ignore_sigint[RW]

Whether `^C` (`control-c`) will be ignored or not.

If set to `false`, `^C` will quit irb.

If set to `true`,

- during input: cancel input then return to top level.

- during execute: abandon current execution.

ignore_sigint?[RW]

Whether `^C` (`control-c`) will be ignored or not.

If set to `false`, `^C` will quit irb.

If set to `true`,

- during input: cancel input then return to top level.

- during execute: abandon current execution.

inspect_mode[R]

A copy of the default `IRB.conf[:INSPECT_MODE]`

io[RW]

The current input method.

Can be either `StdioInputMethod`, `ReadlineInputMethod`, `RelineInputMethod`, `FileInputMethod` or other specified when the context is created. See `::new` for more # information on `input_method`.

irb[RW]

Current irb session.

irb_name[RW]

Can be either name from `IRB.conf[:IRB_NAME]`, or the number of the current job set by `JobManager`, such as `irb#2`

irb_path[RW]

Can be either the `irb_name` surrounded by parenthesis, or the `input_method` passed to `Context.new`

last_value[R]

The return value of the last statement evaluated.

load_modules[RW]

A copy of the default `IRB.conf[:LOAD_MODULES]`

newline_before_multiline_output[RW]

Whether a newline is put before multiline output.

Uses `IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]` if available, or defaults to `true`.

    "abc\ndef"
    #=>
    abc
    def
    IRB.CurrentContext.newline_before_multiline_output = false
    "abc\ndef"
    #=> abc
    def

newline_before_multiline_output?[RW]

Whether a newline is put before multiline output.

Uses `IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]` if available, or defaults to `true`.

    "abc\ndef"
    #=>
    abc
    def
    IRB.CurrentContext.newline_before_multiline_output = false
    "abc\ndef"
    #=> abc
    def

prompt_c[RW]

`IRB` prompt for continuated statement. (e.g. immediately after an `if`)

See Customizing the IRB Prompt at `IRB` for more information.

prompt_i[RW]

Standard `IRB` prompt.

See Customizing the IRB Prompt at `IRB` for more information.

prompt_mode[R]

A copy of the default `IRB.conf[:PROMPT_MODE]`

prompt_n[RW]

See Customizing the IRB Prompt at `IRB` for more information.

prompt_s[RW]

`IRB` prompt for continuated strings.

See Customizing the IRB Prompt at `IRB` for more information.

rc[RW]

A copy of the default `IRB.conf[:RC]`

rc?[RW]

A copy of the default `IRB.conf[:RC]`

return_format[RW]

The format of the return statement, set by `prompt_mode=` using the `:RETURN` of the `mode` passed to set the current `prompt_mode`.

thread[R]

The current thread in this context.

use_autocomplete[R]

Whether colorization is enabled or not.

A copy of the default `IRB.conf[:USE_AUTOCOMPLETE]`

use_autocomplete?[R]

Whether colorization is enabled or not.

A copy of the default `IRB.conf[:USE_AUTOCOMPLETE]`

use_multiline[R]

Whether multiline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_MULTILINE]`

use_multiline?[R]

Whether multiline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_MULTILINE]`

use_readline[R]

Whether singleline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_SINGLELINE]`

use_readline?[R]

Whether singleline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_SINGLELINE]`

use_reline[R]

Whether multiline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_MULTILINE]`

use_reline?[R]

Whether multiline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_MULTILINE]`

use_singleline[R]

Whether singleline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_SINGLELINE]`

use_singleline?[R]

Whether singleline editor mode is enabled or not.

A copy of the default `IRB.conf[:USE_SINGLELINE]`

use_tracer[R]

Whether Tracer is used when evaluating statements in this context.

See `lib/tracer.rb` for more information.

use_tracer?[R]

Whether Tracer is used when evaluating statements in this context.

See `lib/tracer.rb` for more information.

verbose[RW]

Whether verbose messages are displayed or not.

A copy of the default `IRB.conf[:VERBOSE]`

workspace[RW]

`WorkSpace` in the current context.

workspace_home[R]

The toplevel workspace, see `home_workspace`

### Public Class Methods

new(irb, workspace = nil, input_method = nil) click to toggle source

Creates a new `IRB` context.

The optional `input_method` argument:

`nil`

  uses stdin or `Reline` or `Readline`

`String`

  uses a `File`

`other`

  uses this as `InputMethod`

    # File lib/irb/context.rb, line 28
        def initialize(irb, workspace = nil, input_method = nil)
          @irb = irb
          if workspace
            @workspace = workspace
          else
            @workspace = WorkSpace.new
          end
          @thread = Thread.current

          # copy of default configuration
          @ap_name = IRB.conf[:AP_NAME]
          @rc = IRB.conf[:RC]
          @load_modules = IRB.conf[:LOAD_MODULES]

          if IRB.conf.has_key?(:USE_SINGLELINE)
            @use_singleline = IRB.conf[:USE_SINGLELINE]
          elsif IRB.conf.has_key?(:USE_READLINE) # backward compatibility
            @use_singleline = IRB.conf[:USE_READLINE]
          else
            @use_singleline = nil
          end
          if IRB.conf.has_key?(:USE_MULTILINE)
            @use_multiline = IRB.conf[:USE_MULTILINE]
          elsif IRB.conf.has_key?(:USE_RELINE) # backward compatibility
            warn <<~MSG.strip
              USE_RELINE is deprecated, please use USE_MULTILINE instead.
            MSG
            @use_multiline = IRB.conf[:USE_RELINE]
          elsif IRB.conf.has_key?(:USE_REIDLINE)
            warn <<~MSG.strip
              USE_REIDLINE is deprecated, please use USE_MULTILINE instead.
            MSG
            @use_multiline = IRB.conf[:USE_REIDLINE]
          else
            @use_multiline = nil
          end
          @use_autocomplete = IRB.conf[:USE_AUTOCOMPLETE]
          @verbose = IRB.conf[:VERBOSE]
          @io = nil

          self.inspect_mode = IRB.conf[:INSPECT_MODE]
          self.use_tracer = IRB.conf[:USE_TRACER] if IRB.conf[:USE_TRACER]
          self.use_loader = IRB.conf[:USE_LOADER] if IRB.conf[:USE_LOADER]
          self.eval_history = IRB.conf[:EVAL_HISTORY] if IRB.conf[:EVAL_HISTORY]

          @ignore_sigint = IRB.conf[:IGNORE_SIGINT]
          @ignore_eof = IRB.conf[:IGNORE_EOF]

          @back_trace_limit = IRB.conf[:BACK_TRACE_LIMIT]

          self.prompt_mode = IRB.conf[:PROMPT_MODE]

          if IRB.conf[:SINGLE_IRB] or !defined?(IRB::JobManager)
            @irb_name = IRB.conf[:IRB_NAME]
          else
            @irb_name = IRB.conf[:IRB_NAME]+"#"+IRB.JobManager.n_jobs.to_s
          end
          @irb_path = "(" + @irb_name + ")"

          case input_method
          when nil
            @io = nil
            case use_multiline?
            when nil
              if STDIN.tty? && IRB.conf[:PROMPT_MODE] != :INF_RUBY && !use_singleline?
                # Both of multiline mode and singleline mode aren't specified.
                @io = RelineInputMethod.new
              else
                @io = nil
              end
            when false
              @io = nil
            when true
              @io = RelineInputMethod.new
            end
            unless @io
              case use_singleline?
              when nil
                if (defined?(ReadlineInputMethod) && STDIN.tty? &&
                    IRB.conf[:PROMPT_MODE] != :INF_RUBY)
                  @io = ReadlineInputMethod.new
                else
                  @io = nil
                end
              when false
                @io = nil
              when true
                if defined?(ReadlineInputMethod)
                  @io = ReadlineInputMethod.new
                else
                  @io = nil
                end
              else
                @io = nil
              end
            end
            @io = StdioInputMethod.new unless @io

          when '-'
            @io = FileInputMethod.new($stdin)
            @irb_name = '-'
            @irb_path = '-'
          when String
            @io = FileInputMethod.new(input_method)
            @irb_name = File.basename(input_method)
            @irb_path = input_method
          else
            @io = input_method
          end
          self.save_history = IRB.conf[:SAVE_HISTORY] if IRB.conf[:SAVE_HISTORY]

          @extra_doc_dirs = IRB.conf[:EXTRA_DOC_DIRS]

          @echo = IRB.conf[:ECHO]
          if @echo.nil?
            @echo = true
          end

          @echo_on_assignment = IRB.conf[:ECHO_ON_ASSIGNMENT]
          if @echo_on_assignment.nil?
            @echo_on_assignment = :truncate
          end

          @newline_before_multiline_output = IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
          if @newline_before_multiline_output.nil?
            @newline_before_multiline_output = true
          end

          @command_aliases = IRB.conf[:COMMAND_ALIASES]
        end

### Public Instance Methods

__exit__(ret = 0)
Alias for: exit
_set_last_value(value)

See `set_last_value`

Alias for: set_last_value
change_workspace(*_main) click to toggle source

Changes the current workspace to given object or binding.

If the optional argument is omitted, the workspace will be `home_workspace` which is inherited from `TOPLEVEL_BINDING` or the main object, `IRB.conf[:MAIN_CONTEXT]` when irb was initialized.

See `IRB::WorkSpace.new` for more information.

    # File lib/irb/ext/change-ws.rb, line 32
    def change_workspace(*_main)
      if _main.empty?
        @workspace = home_workspace
        return main
      end

      @workspace = WorkSpace.new(_main[0])

      if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
        main.extend ExtendCommandBundle
      end
    end

eval_history=(no) click to toggle source

Sets command result history limit. Default value is set from `IRB.conf[:EVAL_HISTORY]`.

`no` is an `Integer` or `nil`.

Returns `no` of history items if greater than 0.

If `no` is 0, the number of history items is unlimited.

If `no` is `nil`, execution result history isn’t used (default).

`History` values are available via `__` variable, see `IRB::History`.

    # File lib/irb/ext/history.rb, line 51
    def eval_history=(no)
      if no
        if defined?(@eval_history) && @eval_history
          @eval_history_values.size(no)
        else
          @eval_history_values = History.new(no)
          IRB.conf[:__TMP__EHV__] = @eval_history_values
          @workspace.evaluate(self, "__ = IRB.conf[:__TMP__EHV__]")
          IRB.conf.delete(:__TMP_EHV__)
        end
      else
        @eval_history_values = nil
      end
      @eval_history = no
    end

exit(ret = 0) click to toggle source

Exits the current session, see `IRB.irb_exit`

Calls superclass method `Kernel#exit`

    # File lib/irb/context.rb, line 511
    def exit(ret = 0)
      IRB.irb_exit(@irb, ret)
    rescue UncaughtThrowError
      super
    end

Also aliased as: __exit__
file_input?() click to toggle source

Whether `io` uses a `File` for the `input_method` passed when creating the current context, see `::new`

    # File lib/irb/context.rb, line 421
    def file_input?
      @io.class == FileInputMethod
    end

history_file() click to toggle source

A copy of the default `IRB.conf[:HISTORY_FILE]`

    # File lib/irb/ext/save-history.rb, line 48
    def history_file
      IRB.conf[:HISTORY_FILE]
    end

history_file=(hist) click to toggle source

`Set` `IRB.conf[:HISTORY_FILE]` to the given `hist`.

    # File lib/irb/ext/save-history.rb, line 53
    def history_file=(hist)
      IRB.conf[:HISTORY_FILE] = hist
    end

home_workspace() click to toggle source

Inherited from `TOPLEVEL_BINDING`.

    # File lib/irb/ext/change-ws.rb, line 17
    def home_workspace
      if defined? @home_workspace
        @home_workspace
      else
        @home_workspace = @workspace
      end
    end

inspect?() click to toggle source

Whether `inspect_mode` is set or not, see `inspect_mode=` for more detail.

    # File lib/irb/context.rb, line 415
    def inspect?
      @inspect_mode.nil? or @inspect_mode
    end

inspect_mode=(opt) click to toggle source

Specifies the inspect mode with `opt`:

`true`

  display `inspect`

`false`

  display `to_s`

`nil`

  inspect mode in non-math mode, non-inspect mode in math mode

See `IRB::Inspector` for more information.

Can also be set using the `--inspect` and `--noinspect` command line options.

See Command line options at `IRB` for more command line options.

    # File lib/irb/context.rb, line 438
    def inspect_mode=(opt)

      if i = Inspector::INSPECTORS[opt]
        @inspect_mode = opt
        @inspect_method = i
        i.init
      else
        case opt
        when nil
          if Inspector.keys_with_inspector(Inspector::INSPECTORS[true]).include?(@inspect_mode)
            self.inspect_mode = false
          elsif Inspector.keys_with_inspector(Inspector::INSPECTORS[false]).include?(@inspect_mode)
            self.inspect_mode = true
          else
            puts "Can't switch inspect mode."
            return
          end
        when /^\s*\{.*\}\s*$/
          begin
            inspector = eval "proc#{opt}"
          rescue Exception
            puts "Can't switch inspect mode(#{opt})."
            return
          end
          self.inspect_mode = inspector
        when Proc
          self.inspect_mode = IRB::Inspector(opt)
        when Inspector
          prefix = "usr%d"
          i = 1
          while Inspector::INSPECTORS[format(prefix, i)]; i += 1; end
          @inspect_mode = format(prefix, i)
          @inspect_method = opt
          Inspector.def_inspector(format(prefix, i), @inspect_method)
        else
          puts "Can't switch inspect mode(#{opt})."
          return
        end
      end
      print "Switch to#{unless @inspect_mode; ' non';end} inspect mode.\n" if verbose?
      @inspect_mode
    end

irb_level() click to toggle source

Size of the current `WorkSpace` stack

    # File lib/irb/ext/workspaces.rb, line 17
    def irb_level
      workspace_stack.size
    end

main() click to toggle source

The top-level workspace, see `WorkSpace#main`

    # File lib/irb/context.rb, line 160
    def main
      @workspace.main
    end

pop_workspace() click to toggle source

Removes the last element from the current `workspaces` stack and returns it, or `nil` if the current workspace stack is empty.

Also, see `push_workspace`.

    # File lib/irb/ext/workspaces.rb, line 58
    def pop_workspace
      if workspaces.empty?
        print "workspace stack empty\n"
        return
      end
      @workspace = workspaces.pop
    end

prompt_mode=(mode) click to toggle source

Sets the `mode` of the prompt in this context.

See Customizing the IRB Prompt at `IRB` for more information.

    # File lib/irb/context.rb, line 398
    def prompt_mode=(mode)
      @prompt_mode = mode
      pconf = IRB.conf[:PROMPT][mode]
      @prompt_i = pconf[:PROMPT_I]
      @prompt_s = pconf[:PROMPT_S]
      @prompt_c = pconf[:PROMPT_C]
      @prompt_n = pconf[:PROMPT_N]
      @return_format = pconf[:RETURN]
      @return_format = "%s\n" if @return_format == nil
      if ai = pconf.include?(:AUTO_INDENT)
        @auto_indent_mode = ai
      else
        @auto_indent_mode = IRB.conf[:AUTO_INDENT]
      end
    end

prompting?() click to toggle source

Whether `verbose?` is `true`, and `input_method` is either `StdioInputMethod` or `RelineInputMethod` or `ReadlineInputMethod`, see `io` for more information.

    # File lib/irb/context.rb, line 379
    def prompting?
      verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
                   @io.kind_of?(RelineInputMethod) ||
                   (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
    end

push_workspace(*_main) click to toggle source

Creates a new workspace with the given object or binding, and appends it onto the current `workspaces` stack.

See `IRB::Context#change_workspace` and `IRB::WorkSpace.new` for more information.

    # File lib/irb/ext/workspaces.rb, line 35
    def push_workspace(*_main)
      if _main.empty?
        if workspaces.empty?
          print "No other workspace\n"
          return nil
        end
        ws = workspaces.pop
        workspaces.push @workspace
        @workspace = ws
        return workspaces
      end

      workspaces.push @workspace
      @workspace = WorkSpace.new(@workspace.binding, _main[0])
      if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
        main.extend ExtendCommandBundle
      end
    end

save_history() click to toggle source

A copy of the default `IRB.conf[:SAVE_HISTORY]`

    # File lib/irb/ext/save-history.rb, line 24
    def save_history
      IRB.conf[:SAVE_HISTORY]
    end

save_history=(val) click to toggle source

Sets `IRB.conf[:SAVE_HISTORY]` to the given `val` and calls init_save_history with this context.

Will store the number of `val` entries of history in the `history_file`

Add the following to your `.irbrc` to change the number of history entries stored to 1000:

    IRB.conf[:SAVE_HISTORY] = 1000

    # File lib/irb/ext/save-history.rb, line 38
    def save_history=(val)
      IRB.conf[:SAVE_HISTORY] = val
      if val
        main_context = IRB.conf[:MAIN_CONTEXT]
        main_context = self unless main_context
        main_context.init_save_history
      end
    end

set_last_value(value) click to toggle source

Sets the return value from the last statement evaluated in this context to `last_value`.

    # File lib/irb/context.rb, line 390
    def set_last_value(value)
      @last_value = value
      @workspace.local_variable_set :_, value
    end

Also aliased as: _set_last_value
symbol_alias?(command) click to toggle source

Return true if it’s aliased from the argument and it’s not an identifier.

    # File lib/irb/context.rb, line 549
    def symbol_alias?(command)
      return nil if command.match?(/\A\w+\z/)
      command_aliases.key?(command.to_sym)
    end

transform_args?(command) click to toggle source

Return true if the command supports transforming args

    # File lib/irb/context.rb, line 555
    def transform_args?(command)
      command = command_aliases.fetch(command.to_sym, command)
      ExtendCommandBundle.load_command(command)&.respond_to?(:transform_args)
    end

use_loader() click to toggle source

Returns whether `irb`‘s own file reader method is used by `load`/`require` or not.

This mode is globally affected (irb-wide).

    # File lib/irb/ext/use-loader.rb, line 43
    def use_loader
      IRB.conf[:USE_LOADER]
    end

Also aliased as: use_loader?
use_loader=(opt) click to toggle source

Sets `IRB.conf[:USE_LOADER]`

See `use_loader` for more information.

    # File lib/irb/ext/use-loader.rb, line 53
    def use_loader=(opt)

      if IRB.conf[:USE_LOADER] != opt
        IRB.conf[:USE_LOADER] = opt
        if opt
          if !$".include?("irb/cmd/load")
          end
          (class<<@workspace.main;self;end).instance_eval {
            alias_method :load, :irb_load
            alias_method :require, :irb_require
          }
        else
          (class<<@workspace.main;self;end).instance_eval {
            alias_method :load, :__original__load__IRB_use_loader__
            alias_method :require, :__original__require__IRB_use_loader__
          }
        end
      end
      print "Switch to load/require#{unless use_loader; ' non';end} trace mode.\n" if verbose?
      opt
    end

use_loader?()
Alias for: use_loader
use_tracer=(opt) click to toggle source

    # File lib/irb/ext/tracer.rb, line 19
    def use_tracer=(opt)
      # do nothing
    end

verbose?() click to toggle source

Returns whether messages are displayed or not.

    # File lib/irb/context.rb, line 360
    def verbose?
      if @verbose.nil?
        if @io.kind_of?(RelineInputMethod)
          false
        elsif defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
          false
        elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
          true
        else
          false
        end
      else
        @verbose
      end
    end

workspaces() click to toggle source

WorkSpaces in the current stack

    # File lib/irb/ext/workspaces.rb, line 22
    def workspaces
      if defined? @workspaces
        @workspaces
      else
        @workspaces = []
      end
    end