class IRB::Context - IRB Documentation (original) (raw)

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

Constants

ASSIGN_OPERATORS_REGEXP

KERNEL_METHOD

KERNEL_PUBLIC_METHOD

Attributes

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

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.

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.

User-defined IRB command aliases

Whether to echo the return value to output or not.

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

puts "hello"

IRB.CurrentContext.echo = false puts "omg"

Whether to echo the return value to output or not.

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

puts "hello"

IRB.CurrentContext.echo = false puts "omg"

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"

a = "omg" * 10

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

IRB.CurrentContext.echo_on_assignment = true a = "omg" * 10

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

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"

a = "omg" * 10

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

IRB.CurrentContext.echo_on_assignment = true a = "omg" * 10

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

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

If set to false, ^D will quit irb.

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

If set to false, ^D will quit irb.

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

If set to false, ^C will quit irb.

If set to true,

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

If set to false, ^C will quit irb.

If set to true,

Inspector for the current context

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

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.

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

Can be one of the following:

The return value of the last statement evaluated.

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

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

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

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

See Custom Prompts for more information.

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

IRB prompt for continuated strings.

See Custom Prompts for more information.

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

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

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

The current thread in this context.

Whether colorization is enabled or not.

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

Whether colorization is enabled or not.

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

Whether multiline editor mode is enabled or not.

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

Whether multiline editor mode is enabled or not.

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

Whether singleline editor mode is enabled or not.

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

Whether singleline editor mode is enabled or not.

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

Whether multiline editor mode is enabled or not.

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

Whether multiline editor mode is enabled or not.

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

Whether singleline editor mode is enabled or not.

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

Whether singleline editor mode is enabled or not.

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

Whether verbose messages are displayed or not.

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

The toplevel workspace, see home_workspace

Public Class Methods

Source

def initialize(irb, workspace = nil, input_method = nil)
  @irb = irb
  @workspace_stack = []
  if workspace
    @workspace_stack << workspace
  else
    @workspace_stack << WorkSpace.new
  end
  @thread = Thread.current

  
  @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) 
    @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) 
    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]
  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]

  @irb_name = IRB.conf[:IRB_NAME]

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

  self.irb_path = "(" + @irb_name + ")"

  case input_method
  when nil
    @io = nil
    case use_multiline?
    when nil
      if term_interactive? && IRB.conf[:PROMPT_MODE] != :INF_RUBY && !use_singleline?
        
        @io = RelineInputMethod.new(build_completor)
      else
        @io = nil
      end
    when false
      @io = nil
    when true
      @io = RelineInputMethod.new(build_completor)
    end
    unless @io
      case use_singleline?
      when nil
        if (defined?(ReadlineInputMethod) && term_interactive? &&
            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 = '-'
    self.irb_path = '-'
  when String
    @io = FileInputMethod.new(input_method)
    @irb_name = File.basename(input_method)
    self.irb_path = input_method
  else
    @io = input_method
  end
  @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].dup
end

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

Public Instance Methods

Source

def colorize_input(input, complete:) if IRB.conf[:USE_COLORIZE] && IRB::Color.colorable? lvars = local_variables || [] parsed_input = parse_input(input, false) if parsed_input.is_a?(Statement::Command) name, sep, arg = input.split(/(\s+)/, 2) arg = IRB::Color.colorize_code(arg, complete: complete, local_variables: lvars) "#{IRB::Color.colorize(name, [:BOLD])}\e[m#{sep}#{arg}" else IRB::Color.colorize_code(input, complete: complete, local_variables: lvars) end else Reline::Unicode.escape_for_print(input) end end

Source

def eval_history=(val) self.class.remove_method(method) require_relative "ext/eval_history" send(method, val) end

Source

def file_input? @io.class == FileInputMethod end

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

Source

def from_binding? @irb.from_binding end

Source

def history_file IRB.conf[:HISTORY_FILE] end

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

Source

def history_file=(hist) IRB.conf[:HISTORY_FILE] = hist end

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

Source

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

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.

Source

def inspector_support_stream_output? @inspect_method.support_stream_output? end

Source

def irb_path=(path) @irb_path = path

if File.exist?(path) @eval_path = "#{path}(#{IRB.conf[:IRB_NAME]})" else @eval_path = path end end

Sets @irb_path to the given path as well as @eval_path @eval_path is used for evaluating code in the context of IRB session It’s the same as irb_path, but with the IRB name postfix This makes sure users can distinguish the methods defined in the IRB session from the methods defined in the current file’s context, especially with binding.irb

Source

def main workspace.main end

The top-level workspace, see WorkSpace#main

Source

def parse_input(code, is_assignment_expression)
  command_name, arg = code.strip.split(/\s+/, 2)
  arg ||= ''

  
  if code.lines.size != 1 ||
    
    command_name.nil? ||
    
    local_variables.include?(command_name.to_sym) ||
    
    (is_assignment_expression ||
    (arg.start_with?(ASSIGN_OPERATORS_REGEXP) && !arg.start_with?(/==|=~/)))
    return Statement::Expression.new(code, is_assignment_expression)
  end

  command = command_name.to_sym

  
  if aliased_name = command_aliases[command]
    if command_class = Command.load_command(aliased_name)
      command = aliased_name
    elsif HelperMethod.helper_methods[aliased_name]
      message = <<~MESSAGE
        Using command alias `#{command}` for helper method `#{aliased_name}` is not supported.
        Please check the value of `IRB.conf[:COMMAND_ALIASES]`.
      MESSAGE
      return Statement::IncorrectAlias.new(message)
    else
      message = <<~MESSAGE
        You're trying to use command alias `#{command}` for command `#{aliased_name}`, but `#{aliased_name}` does not exist.
        Please check the value of `IRB.conf[:COMMAND_ALIASES]`.
      MESSAGE
      return Statement::IncorrectAlias.new(message)
    end
  else
    command_class = Command.load_command(command)
  end

  
  public_method = !!KERNEL_PUBLIC_METHOD.bind_call(main, command) rescue false
  private_method = !public_method && !!KERNEL_METHOD.bind_call(main, command) rescue false
  if command_class && Command.execute_as_command?(command, public_method: public_method, private_method: private_method)
    Statement::Command.new(code, command_class, arg)
  else
    Statement::Expression.new(code, is_assignment_expression)
  end
end

Source

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] @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

Sets the mode of the prompt in this context.

See Custom Prompts for more information.

Source

def prompt_n warn "IRB::Context#prompt_n is deprecated and will be removed in the next major release." "" end

TODO: Remove this when developing v2.0

Source

def prompt_n=(_) warn "IRB::Context#prompt_n= is deprecated and will be removed in the next major release." "" end

TODO: Remove this when developing v2.0

Source

def prompting? verbose? || @io.prompting? end

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

Source

def replace_workspace(workspace) @workspace_stack.pop @workspace_stack.push(workspace) end

Replace the current workspace with the given workspace.

Source

def safe_method_call_on_main(method_name) main_object = main Object === main_object ? main_object.send(method_name) : Object.instance_method(method_name).bind_call(main_object) end

Source

def save_history IRB.conf[:SAVE_HISTORY] end

Source

def save_history=(val) IRB.conf[:SAVE_HISTORY] = val end

Source

def set_last_value(value) @last_value = value workspace.local_variable_set :_, value end

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

Source

def use_loader=(val) self.class.remove_method(method) require_relative "ext/use-loader" send(method, val) end

Source

def use_tracer=(val) require_relative "ext/tracer" if val IRB.conf[:USE_TRACER] = val end

Source

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

Returns whether messages are displayed or not.

Source

def workspace @workspace_stack.last end

Workspace in the current context.