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
,
- during input: cancel input then return to top level.
- during execute: abandon current execution.
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.
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 irb_name surrounded by parenthesis
- the
input_method
passed to Context.new - the file path of the current IRB context in a binding.irb session
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.