Module: IRB
Overview
Module IRB ("Interactive Ruby") provides a shell-like interface that supports user interaction with the Ruby interpreter.
It operates as a read-eval-print loop (REPL) that:
-   Reads each character as you type. You can modify the IRBcontext to change the way input works. See Input.
- Evaluates the code each time it has read a syntactically complete passage.
-   Prints after evaluating. You can modify the IRBcontext to change the way output works. See Output.
Example:
$ irb
irb(main):001> File.basename(Dir.pwd)
#=> "irb"
irb(main):002> Dir.entries('.').size
#=> 25
irb(main):003* Dir.entries('.').select do |entry|
irb(main):004*   entry.start_with?('R')
irb(main):005> end
#=> ["README.md", "Rakefile"]The typed input may also include \IRB-specific commands.
As seen above, you can start IRB by using the shell command .irb.
You can stop an IRB session by typing command exit:
irb(main):006> exit
$At that point, IRB calls any hooks found in array IRB.conf[:AT_EXIT], then
exits.
Startup
At startup, IRB:
- Interprets (as Ruby code) the content of the configuration file (if given).
- Constructs the initial session context from hash IRB.conf and from default values; the hash content may have been affected by command-line options, and by direct assignments in the configuration file.
- Assigns the context to variable .conf.
-  Assigns command-line arguments to variable ARGV.
- Prints the prompt.
- Puts the content of the initialization script onto the IRB shell, just as if it were user-typed commands.
The Command Line
On the command line, all options precede all arguments; the first item that is not recognized as an option is treated as an argument, as are all items that follow.
Command-Line Options
Many command-line options affect entries in hash .conf, which in turn
affect the initial configuration of the IRB session.
Details of the options are described in the relevant subsections below.
A cursory list of the IRB command-line options may be seen in the help
message,
which is also displayed if you use command-line option --help.
If you are interested in a specific option, consult the index.
Command-Line Arguments
Command-line arguments are passed to IRB in array ARGV:
$ irb --noscript Foo Bar Baz
irb(main):001> ARGV
#=> ["Foo", "Bar", "Baz"]
irb(main):002> exit
$Command-line option -- causes everything that follows to be treated as
arguments, even those that look like options:
$ irb --noscript -- --noscript -- Foo Bar Baz
irb(main):001> ARGV
#=> ["--noscript", "--", "Foo", "Bar", "Baz"]
irb(main):002> exit
$Configuration File
You can initialize IRB via a configuration file.
If command-line option -f is given, no configuration file is looked for.
Otherwise, IRB reads and interprets a configuration file if one is available.
The configuration file can contain any Ruby code, and can usefully include user code that:
-   Can then be debugged in IRB.
- Configures IRB itself.
- Requires or loads files.
The path to the configuration file is the first found among:
-   The value of variable $IRBRC, if defined.
-   The value of variable $XDG_CONFIG_HOME/irb/irbrc, if defined.
-   File $HOME/.irbrc, if it exists.
-   File $HOME/.config/irb/irbrc, if it exists.
-   File .irbrcin the current directory, if it exists.
-   File irb.rcin the current directory, if it exists.
-   File _irbrcin the current directory, if it exists.
-   File $irbrcin the current directory, if it exists.
If the search fails, there is no configuration file.
If the search succeeds, the configuration file is read as Ruby code, and so can contain any Ruby programming you like.
Method conf.rc? returns true if a configuration file was read, false
otherwise. Hash entry IRB.conf[:RC] also contains that value.
Hash .conf
The initial entries in hash .conf are determined by:
- Default values.
- Command-line options, which may override defaults.
- Direct assignments in the configuration file.
You can see the hash by typing .conf.
Details of the entries' meanings are described in the relevant subsections below.
If you are interested in a specific entry, consult the index.
Notes on Initialization Precedence
- Any conflict between an entry in hash .conf and a command-line option is resolved in favor of the hash entry.
- Hash .conf affects the context only once, when the configuration file is interpreted; any subsequent changes to it do not affect the context and are therefore essentially meaningless.
Initialization Script
By default, the first command-line argument (after any options) is the path to a Ruby initialization script.
IRB reads the initialization script and puts its content onto the IRB shell,
just as if it were user-typed commands.
Command-line option --noscript causes the first command-line argument to be
treated as an ordinary argument (instead of an initialization script);
--script is the default.
Input
This section describes the features that allow you to change the way IRB input
works; see also Input and Output.
Input Command History
By default, IRB stores a history of up to 1000 input commands in a file named
.irb_history. The history file will be in the same directory as the
configuration file if one is found, or in
~/ otherwise.
A new IRB session creates the history file if it does not exist, and appends
to the file if it does exist.
You can change the filepath by adding to your configuration file:
IRB.conf[:HISTORY_FILE] = filepath, where filepath is a string filepath.
During the session, method conf.history_file returns the filepath, and
method conf.history_file = new_filepath copies the history to the file at
new_filepath, which becomes the history file for the session.
You can change the number of commands saved by adding to your configuration
file: IRB.conf[:SAVE_HISTORY] = n, where n is one of:
- Positive integer: the number of commands to be saved.
- Negative integer: all commands are to be saved.
-   Zero or nil: no commands are to be saved.
During the session, you can use methods conf.save_history or
conf.save_history= to retrieve or change the count.
Command Aliases
By default, IRB defines several command aliases:
irb(main):001> conf.command_aliases
#=> {:"$"=>:show_source, :"@"=>:whereami}You can change the initial aliases in the configuration file with:
IRB.conf[:COMMAND_ALIASES] = {foo: :show_source, bar: :whereami}You can replace the current aliases at any time with configuration method
conf.command_aliases=; Because conf.command_aliases is a hash, you can
modify it.
End-of-File
By default, IRB.conf[:IGNORE_EOF] is false, which means that typing the
end-of-file character Ctrl-D causes the session to exit.
You can reverse that behavior by adding IRB.conf[:IGNORE_EOF] = true to the
configuration file.
During the session, method conf.ignore_eof? returns the setting, and method
conf.ignore_eof = boolean sets it.
SIGINT
By default, IRB.conf[:IGNORE_SIGINT] is true, which means that typing the
interrupt character Ctrl-C causes the session to exit.
You can reverse that behavior by adding IRB.conf[:IGNORE_SIGING] = false to
the configuration file.
During the session, method conf.ignore_siging? returns the setting, and
method conf.ignore_sigint = boolean sets it.
Automatic Completion
By default, IRB enables automatic
completion:
You can disable it by either of these:
-   Adding IRB.conf[:USE_AUTOCOMPLETE] = falseto the configuration file.
-   Giving command-line option --noautocomplete(--autocompleteis the default).
Method conf.use_autocomplete? returns true if automatic completion is
enabled, false otherwise.
The setting may not be changed during the session.
Automatic Indentation
By default, IRB automatically indents lines of code to show structure (e.g.,
it indent the contents of a block).
The current setting is returned by the configuration method
conf.auto_indent_mode.
The default initial setting is true:
irb(main):001> conf.auto_indent_mode
#=> true
irb(main):002* Dir.entries('.').select do |entry|
irb(main):003*   entry.start_with?('R')
irb(main):004> end
#=> ["README.md", "Rakefile"]You can change the initial setting in the configuration file with:
IRB.conf[:AUTO_INDENT] = falseNote that the current setting may not be changed in the IRB session.
Input Method
The IRB input method determines how command input is to be read; by default,
the input method for a session is RelineInputMethod. Unless the
value of the TERM environment variable is 'dumb', in which case the
most simplistic input method is used.
You can set the input method by:
- Adding to the configuration file: -   IRB.conf[:USE_SINGLELINE] = trueorIRB.conf[:USE_MULTILINE]= falsesets the input method to IRB::ReadlineInputMethod.
-   IRB.conf[:USE_SINGLELINE] = falseorIRB.conf[:USE_MULTILINE] = truesets the input method to IRB::RelineInputMethod.
 
-   
- Giving command-line options: -   --singlelineor--nomultilinesets the input method to IRB::ReadlineInputMethod.
-   --nosinglelineor--multilinesets the input method to IRB::RelineInputMethod.
-   --nosinglelinetogether with--nomultilinesets the input to IRB::StdioInputMethod.
 
-   
Method conf.use_multiline? and its synonym conf.use_reline return:
-   trueif option--multilinewas given.
-   falseif option--nomultilinewas given.
-   nilif neither was given.
Method conf.use_singleline? and its synonym conf.use_readline return:
-   trueif option--singlelinewas given.
-   falseif option--nosinglelinewas given.
-   nilif neither was given.
Output
This section describes the features that allow you to change the way IRB
output works; see also Input and Output.
Return-Value Printing (Echoing)
By default, IRB prints (echoes) the values returned by all input commands.
You can change the initial behavior and suppress all echoing by:
-   Adding to the configuration file: IRB.conf[:ECHO] = false. (The default value for this entry isnil, which means the same astrue.)
-   Giving command-line option --noecho. (The default is--echo.)
During the session, you can change the current setting with configuration
method conf.echo= (set to true or false).
As stated above, by default IRB prints the values returned by all input
commands; but IRB offers special treatment for values returned by assignment
statements, which may be:
- Printed with truncation (to fit on a single line of output), which is the default; an ellipsis ( - ...is suffixed, to indicate the truncation):- irb(main):001> x = 'abc' * 100
"abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc...
- Printed in full (regardless of the length).
- Suppressed (not printed at all)
You can change the initial behavior by:
-   Adding to the configuration file: IRB.conf[:ECHO_ON_ASSIGNMENT] = false. (The default value for this entry isniL, which means the same as:truncate.)
-   Giving command-line option --noecho-on-assignmentor--echo-on-assignment. (The default is--truncate-echo-on-assignment.)
During the session, you can change the current setting with configuration
method conf.echo_on_assignment= (set to true, false, or :truncate).
By default, IRB formats returned values by calling method .inspect.
You can change the initial behavior by:
-   Adding to the configuration file: IRB.conf[:INSPECT_MODE] = false. (The default value for this entry istrue.)
-   Giving command-line option --noinspect. (The default is--inspect.)
During the session, you can change the setting using method
conf.inspect_mode=.
Multiline Output
By default, IRB prefixes a newline to a multiline response.
You can change the initial default value by adding to the configuration file:
IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT] = falseDuring a session, you can retrieve or set the value using methods
conf.newline_before_multiline_output? and
conf.newline_before_multiline_output=.
Examples:
irb(main):001> conf.inspect_mode = false
#=> false
irb(main):002> "foo\nbar"
=>
foo
irb(main):003> conf.newline_before_multiline_output = false
#=> false
irb(main):004> "foo\nbar"
#=> foo
Evaluation History
By default, IRB saves no history of evaluations (returned values), and the
related methods conf.eval_history, , and _ are undefined.
You can turn on that history, and set the maximum number of evaluations to be stored:
-   In the configuration file: add IRB.conf[:EVAL_HISTORY] = n. (Examples below assume that we've addedIRB.conf[:EVAL_HISTORY] = 5.)
-   In the session (at any time): conf.eval_history = n.
If n is zero, all evaluation history is stored.
Doing either of the above:
- Sets the maximum size of the evaluation history; defines method - conf.eval_history, which returns the maximum size- nof the evaluation history:- irb(main):001> conf.eval_history = 5 #=> 5 irb(main):002> conf.eval_history #=> 5
- Defines variable - _, which contains the most recent evaluation, or- nilif none; same as method- conf.last_value:- irb(main):003> _ #=> 5 irb(main):004> :foo #=> :foo irb(main):005> : #=> :bar irb(main):006> _ #=> :bar irb(main):007> _ #=> :bar
- Defines variable - __:- __unadorned: contains all evaluation history:- irb(main):008> :foo #=> :foo irb(main):009> : #=> :bar irb(main):010> :baz #=> :baz irb(main):011> :bat #=> :bat irb(main):012> :bam #=> :bam irb(main):013> __ => 9 : 10 :baz 11 :bat 12 :bam irb(main):014> __ => 10 :baz 11 :bat 12 :bam 13 ...self-history...- Note that when the evaluation is multiline, it is displayed differently. 
- __[m- ]:- Positive m: contains the evaluation for the given line number, or - nilif that line number is not in the evaluation history:- irb(main):015> __[12] #=> :bam irb(main):016> __[1] #=> nil
- Negative m: contains the - mth-from-end evaluation, or- nilif that evaluation is not in the evaluation history:- irb(main):017> __[-3] #=> :bam irb(main):018> __[-13] #=> nil
- Zero m: contains - nil:- irb(main):019> __[0] #=> nil
 
 
Prompt and Return Formats
By default, IRB uses the prompt and return value formats defined in its
:DEFAULT prompt mode.
The Default Prompt and Return Format
The default prompt and return values look like this:
irb(main):001> 1 + 1
#=> 2
irb(main):002> 2 + 2
#=> 4The prompt includes:
- The name of the running program (.irb); see IRB Name.
-   The name of the current session (main); See IRB Sessions.
- A 3-digit line number (1-based).
The default prompt actually defines three formats:
- One for most situations (as above): - irb(main):003> Dir #=> Dir
- One for when the typed command is a statement continuation (adds trailing asterisk): - irb(main):004* Dir.
- One for when the typed command is a string continuation (adds trailing single-quote): - irb(main):005' Dir.entries('.
You can see the prompt change as you type the characters in the following:
irb(main):001* Dir.entries('.').select do |entry|
irb(main):002*   entry.start_with?('R')
irb(main):003> end
#=> ["README.md", "Rakefile"]Pre-Defined Prompts
IRB has several pre-defined prompts, stored in hash IRB.conf[:PROMPT]:
irb(main):001> IRB.conf[:PROMPT].keys
#=> [:NULL, :DEFAULT, :CLASSIC, :SIMPLE, :INF_RUBY, :XMP]To see the full data for these, type IRB.conf[:PROMPT].
Most of these prompt definitions include specifiers that represent values like
the IRB name, session name, and line number; see Prompt
Specifiers.
You can change the initial prompt and return format by:
-   Adding to the configuration file: IRB.conf[:PROMPT] = modewhere mode is the symbol name of a prompt mode.
- Giving a command-line option: -   --prompt *mode*: sets the prompt mode to mode. where mode is the symbol name of a prompt mode.
-   --simple-promptor--sample-book-mode: sets the prompt mode to:SIMPLE.
-   --inf-ruby-mode: sets the prompt mode to:INF_RUBYand suppresses both--multilineand--singleline.
-   --noprompt: suppresses prompting; does not affect echoing.
 
-   
You can retrieve or set the current prompt mode with methods
conf.prompt_mode and conf.prompt_mode=.
If you're interested in prompts and return formats other than the defaults, you might experiment by trying some of the others.
Custom Prompts
You can also define custom prompts and return formats, which may be done
either in an IRB session or in the configuration file.
A prompt in IRB actually defines three prompts, as seen above. For simple
custom data, we'll make all three the same:
irb(main):001* IRB.conf[:PROMPT][:MY_PROMPT] = {
irb(main):002*   PROMPT_I: ': ',
irb(main):003*   PROMPT_C: ': ',
irb(main):004*   PROMPT_S: ': ',
irb(main):005*   RETURN: '=> '
irb(main):006> }
#=> {:PROMPT_I=>": ", :PROMPT_C=>": ", :PROMPT_S=>": ", :RETURN=>"=> "}If you define the custom prompt in the configuration file, you can also make it the current prompt by adding:
IRB.conf[:PROMPT_MODE] = :MY_PROMPTRegardless of where it's defined, you can make it the current prompt in a session:
conf.prompt_mode = :MY_PROMPTYou can view or modify the current prompt data with various configuration methods:
-   conf.prompt_mode,conf.prompt_mode=.
-   conf.prompt_c,conf.c=.
-   conf.prompt_i,conf.i=.
-   conf.prompt_s,conf.s=.
-   conf.return_format,return_format=.
Prompt Specifiers
A prompt's definition can include specifiers for which certain values are substituted:
-   %N: the name of the running program.
-   %m: the value ofself.to_s.
-   %M: the value ofself.inspect.
-   %l: an indication of the type of string; one of",',/,].
-   %NNi: Indentation level. NN is a 2-digit number that specifies the number of digits of the indentation level (03 will result in 001).
-   %NNn: Line number. NN is a 2-digit number that specifies the number of digits of the line number (03 will result in 001).
-   %%: Literal%.
Verbosity
By default, IRB verbosity is disabled, which means that output is smaller
rather than larger.
You can enable verbosity by:
-   Adding to the configuration file: IRB.conf[:VERBOSE] = true(the default isnil).
-   Giving command-line options --verbose(the default is--noverbose).
During a session, you can retrieve or set verbosity with methods
conf.verbose and conf.verbose=.
Help
Command-line option --version causes IRB to print its help text and exit.
Version
Command-line option --version causes IRB to print its version text and exit.
Input and Output
Color Highlighting
By default, IRB color highlighting is enabled, and is used for both:
-   Input: As you type, IRBreads the typed characters and highlights elements that it recognizes; it also highlights errors such as mismatched parentheses.
-   Output: IRBhighlights syntactical elements.
You can disable color highlighting by:
-   Adding to the configuration file: IRB.conf[:USE_COLORIZE] = false(the default value istrue).
-   Giving command-line option --nocolorize
Debugging
Command-line option -d sets variables $VERBOSE and $DEBUG to true;
these have no effect on IRB output.
Warnings
Command-line option -w suppresses warnings.
Command-line option -W[level] sets warning level;
- 0=silence
- 1=medium
- 2=verbose
Other Features
Load Modules
You can specify the names of modules that are to be required at startup.
Array conf.load_modules determines the modules (if any) that are to be
required during session startup. The array is used only during session
startup, so the initial value is the only one that counts.
The default initial value is [] (load no modules):
irb(main):001> conf.load_modules
#=> []You can set the default initial value via:
- Command-line option - -r- $ irb -r csv -r json irb(main):001> conf.load_modules #=> ["csv", "json"]
- Hash entry - IRB.conf[:LOAD_MODULES] = *array*:- IRB.conf[:LOAD_MODULES] = %w[csv, json]
Note that the configuration file entry overrides the command-line options.
RI Documentation Directories
You can specify the paths to RI documentation directories that are to be
loaded (in addition to the default directories) at startup; see details about
RI by typing ri --help.
Array conf.extra_doc_dirs determines the directories (if any) that are to be
loaded during session startup. The array is used only during session startup,
so the initial value is the only one that counts.
The default initial value is [] (load no extra documentation):
irb(main):001> conf.extra_doc_dirs
#=> []You can set the default initial value via:
- Command-line option - --extra_doc_dir- $ irb --extra-doc-dir your_doc_dir --extra-doc-dir my_doc_dir irb(main):001> conf.extra_doc_dirs #=> ["your_doc_dir", "my_doc_dir"]
- Hash entry - IRB.conf[:EXTRA_DOC_DIRS] = *array*:- IRB.conf[:EXTRA_DOC_DIRS] = %w[your_doc_dir my_doc_dir]
Note that the configuration file entry overrides the command-line options.
IRB Name
You can specify a name for IRB.
The default initial value is 'irb':
irb(main):001> conf.irb_name
#=> "irb"You can set the default initial value via hash entry IRB.conf[:IRB_NAME] =
*string*:
IRB.conf[:IRB_NAME] = 'foo'Application Name
You can specify an application name for the IRB session.
The default initial value is 'irb':
irb(main):001> conf.ap_name
#=> "irb"You can set the default initial value via hash entry IRB.conf[:AP_NAME] =
*string*:
IRB.conf[:AP_NAME] = 'my_ap_name'Configuration Monitor
You can monitor changes to the configuration by assigning a proc to
IRB.conf[:IRB_RC] in the configuration file:
IRB.conf[:IRB_RC] = proc {|conf| puts conf.class }Each time the configuration is changed, that proc is called with argument .conf:
Encodings
Command-line option -E ex[:in] sets initial external (ex) and internal
(in) encodings.
Command-line option -U sets both to UTF-8.
Commands
Please use the help command to see the list of available commands.
IRB Sessions
IRB has a special feature, that allows you to manage many sessions at once.
You can create new sessions with Irb.irb, and get a list of current sessions
with the jobs command in the prompt.
Configuration
The command line options, or .conf, specify the default behavior of
Irb.irb.
On the other hand, each conf in IRB@Command-Line+Options is used to individually configure .irb.
If a proc is set for IRB.conf[:IRB_RC], its will be invoked after execution
of that proc with the context of the current session as its argument. Each
session can be configured using this mechanism.
Session variables
There are a few variables in every Irb session that can come in handy:
:   The value command executed, as a local variable
:   The history of evaluated commands. Available only if
    IRB.conf[:EVAL_HISTORY] is not nil (which is the default). See also
    IRB::Context#eval_history= and IRB::History.
_[line_no]
:   Returns the evaluation value at the given line number, line_no. If
    line_no is a negative, the return value line_no many lines before the
    most recent return value.
Restrictions
Ruby code typed into IRB behaves the same as Ruby code in a file, except that:
- Because IRB evaluates input immediately after it is syntactically complete, some results may be slightly different.
- Forking may not be well behaved.
Constant Summary
- 
    ExtendCommand =
    
 # File 'lib/irb/default_commands.rb', line 254Command
- 
    IRBRC_EXT =
    Internal use only
    
 # File 'lib/irb/init.rb', line 407"rc"
- 
    TOPLEVEL_BINDING =
    
 # File 'lib/irb/workspace.rb', line 9binding
- 
    VERSION =
    Internal use only
    
 # File 'lib/irb/version.rb', line 8"1.14.3"
Class Attribute Summary
- .initialized? ⇒ Boolean readonly Internal use only
Class Method Summary
- .easter_egg(type = nil)
- .easter_egg_logo(type)
- 
    
      .start(ap_path = nil)  
    
    Initializes IRB and creates a new Irb.irbobject at the TOPLEVEL_BINDING
- 
    
      .conf  
    
    Internal use only
    Displays current configuration. 
- CurrentContext Internal use only
- .init_config(ap_path) Internal use only
- .init_error Internal use only
- .inspect Internal use only
- 
    
      Inspector(inspect, init = nil)  
    
    Internal use only
    Convenience method to create a new Inspector, using the given .inspect proc, and optionalinitproc and passes them to Inspector.new
- 
    
      .irb(file = nil, *main)  
    
    Internal use only
    Creates a new IRBsession, see Irb.new.
- 
    
      .irb_abort(irb, exception = Abort)  
    
    Internal use only
    Aborts then interrupts irb. 
- 
    
      .irb_exit  
    
    Internal use only
    Quits irb. 
- .irbrc_files Internal use only
- 
    
      JobManager  
    
    Internal use only
    The current JobManagerin the session.
- 
    
      .load_modules  
    
    Internal use only
    loading modules. 
- 
    
      .parse_opts(argv: ::ARGV)  
    
    Internal use only
    option analyzing. 
- 
    
      .print_usage  
    
    Internal use only
    Outputs the irb help message, see IRB@Command-Line+Options. 
- .raise_validation_error(msg) Internal use only
- .rc_file(ext) Internal use only
- 
    
      .run_config  
    
    Internal use only
    Run the config file. 
- .set_measure_callback(type = nil, arg = nil, &block) Internal use only
- 
    
      .setup(ap_path, argv: ::ARGV)  
    
    Internal use only
    initialize config. 
- .unset_measure_callback(type = nil) Internal use only
- .validate_config Internal use only
- 
    
      .version  
    
    Internal use only
    Returns the current version of IRB, including release version and last updated date.
- 
    
      .generate_current_dir_irbrc_files  
    
    private
    Internal use only
    possible irbrc files in current directory. 
- .prepare_irbrc_name_generators private Internal use only
- 
    
      .rc_file_generators  
    
    private
    Internal use only
    enumerate possible rc-file base name generators. 
- .set_encoding(extern, intern = nil, override: true) private Internal use only
Class Attribute Details
    .initialized?  ⇒ Boolean  (readonly)
  
  # File 'lib/irb/init.rb', line 45
def IRB.initialized? !!@INITIALIZED end
Class Method Details
.conf
Displays current configuration.
Modifying the configuration is achieved by sending a message to conf.
See IRB@Configuration for more information.
# File 'lib/irb/init.rb', line 15
def IRB.conf @CONF end
CurrentContext
The current ::IRB::Context of the session, see .conf
irb
irb(main):001:0> IRB.CurrentContext.irb_name = "foo"
foo(main):002:0> IRB.conf[:MAIN_CONTEXT].irb_name #=> "foo"See additional method definition at file lib/irb.rb line 890.
# File 'lib/irb/ext/multi-irb.rb', line 174
def CurrentContext # :nodoc: conf[:MAIN_CONTEXT] end
.easter_egg(type = nil)
[ GitHub ]# File 'lib/irb/easter-egg.rb', line 109
private def easter_egg(type = nil) print "\e[?1049h" type ||= [:logo, :dancing].sample case type when :logo Pager.page do |io| logo_type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode_large : :ascii_large io.write easter_egg_logo(logo_type) STDIN.raw { STDIN.getc } if io == STDOUT end when :dancing STDOUT.cooked do interrupted = false prev_trap = trap("SIGINT") { interrupted = true } canvas = Canvas.new(Reline.get_screen_size) Reline::IOGate.set_winch_handler do canvas = Canvas.new(Reline.get_screen_size) end ruby_model = RubyModel.new print "\e[?25l" # hide cursor 0.step do |i| # TODO (0..).each needs Ruby 2.6 or later buff = canvas.draw do ruby_model.render_frame(i) do |p1, p2| canvas.line(p1, p2) end end buff[0, 20] = "\e[0mPress Ctrl+C to stop\e[31m\e[1m" print "\e[H" + buff sleep 0.05 break if interrupted end rescue Interrupt ensure print "\e[?25h" # show cursor trap("SIGINT", prev_trap) end end ensure print "\e[0m\e[?1049l" end
.easter_egg_logo(type)
[ GitHub ]# File 'lib/irb/easter-egg.rb', line 101
private def easter_egg_logo(type) @easter_egg_logos ||= File.read(File.join(__dir__, 'ruby_logo.aa'), encoding: 'UTF-8:UTF-8') .split(/TYPE: ([A-Z_]+)\n/)[1..] .each_slice(2) .to_h @easter_egg_logos[type.to_s.upcase] end
.generate_current_dir_irbrc_files (private)
possible irbrc files in current directory
# File 'lib/irb/init.rb', line 517
def generate_current_dir_irbrc_files current_dir = Dir.pwd %w[.irbrc irbrc _irbrc $irbrc].map { |file| "#{current_dir}/#{file}" } end
.init_config(ap_path)
# File 'lib/irb/init.rb', line 65
def IRB.init_config(ap_path) # default configurations unless ap_path and @CONF[:AP_NAME] ap_path = File.join(File.dirname(File.dirname(__FILE__)), "irb.rb") end @CONF[:VERSION] = version @CONF[:AP_NAME] = File::basename(ap_path, ".rb") @CONF[:IRB_NAME] = "irb" @CONF[:IRB_LIB_PATH] = File.dirname(__FILE__) @CONF[:RC] = true @CONF[:LOAD_MODULES] = [] @CONF[:IRB_RC] = nil @CONF[:USE_SINGLELINE] = false unless defined?(ReadlineInputMethod) @CONF[:USE_COLORIZE] = (nc = ENV['NO_COLOR']).nil? || nc.empty? @CONF[:USE_AUTOCOMPLETE] = ENV.fetch("IRB_USE_AUTOCOMPLETE", "true") != "false" @CONF[:COMPLETOR] = ENV["IRB_COMPLETOR"]&.to_sym @CONF[:INSPECT_MODE] = true @CONF[:USE_TRACER] = false @CONF[:USE_LOADER] = false @CONF[:IGNORE_SIGINT] = true @CONF[:IGNORE_EOF] = false @CONF[:USE_PAGER] = true @CONF[:EXTRA_DOC_DIRS] = [] @CONF[:ECHO] = nil @CONF[:ECHO_ON_ASSIGNMENT] = nil @CONF[:VERBOSE] = nil @CONF[:EVAL_HISTORY] = nil @CONF[:SAVE_HISTORY] = 1000 @CONF[:BACK_TRACE_LIMIT] = 16 @CONF[:PROMPT] = { :NULL => { :PROMPT_I => nil, :PROMPT_S => nil, :PROMPT_C => nil, :RETURN => "%s\n" }, :DEFAULT => { :PROMPT_I => "%N(%m):%03n> ", :PROMPT_S => "%N(%m):%03n%l ", :PROMPT_C => "%N(%m):%03n* ", :RETURN => "=> %s\n" }, :CLASSIC => { :PROMPT_I => "%N(%m):%03n:%i> ", :PROMPT_S => "%N(%m):%03n:%i%l ", :PROMPT_C => "%N(%m):%03n:%i* ", :RETURN => "%s\n" }, :SIMPLE => { :PROMPT_I => ">> ", :PROMPT_S => "%l> ", :PROMPT_C => "?> ", :RETURN => "=> %s\n" }, :INF_RUBY => { :PROMPT_I => "%N(%m):%03n> ", :PROMPT_S => nil, :PROMPT_C => nil, :RETURN => "%s\n", :AUTO_INDENT => true }, :XMP => { :PROMPT_I => nil, :PROMPT_S => nil, :PROMPT_C => nil, :RETURN => " ==>%s\n" } } @CONF[:PROMPT_MODE] = (STDIN.tty? ? :DEFAULT : :NULL) @CONF[:AUTO_INDENT] = true @CONF[:CONTEXT_MODE] = 4 # use a copy of TOPLEVEL_BINDING @CONF[:SINGLE_IRB] = false @CONF[:MEASURE] = false @CONF[:MEASURE_PROC] = {} @CONF[:MEASURE_PROC][:TIME] = proc { |context, code, line_no, &block| time = Time.now result = block.() now = Time.now puts 'processing time: %fs' % (now - time) if IRB.conf[:MEASURE] result } # arg can be either a symbol for the mode (:cpu, :wall, ..) or a hash for # a more complete configuration. # See https://github.com/tmm1/stackprof#all-options. @CONF[:MEASURE_PROC][:STACKPROF] = proc { |context, code, line_no, arg, &block| return block.() unless IRB.conf[:MEASURE] success = false begin require 'stackprof' success = true rescue LoadError puts 'Please run "gem install stackprof" before measuring by StackProf.' end if success result = nil arg = { mode: arg || :cpu } unless arg.is_a?(Hash) stackprof_result = StackProf.run(**arg) do result = block.() end case stackprof_result when File puts "StackProf report saved to #{stackprof_result.path}" when Hash StackProf::Report.new(stackprof_result).print_text else puts "Stackprof ran with #{arg.inspect}" end result else block.() end } @CONF[:MEASURE_CALLBACKS] = [] @CONF[:LC_MESSAGES] = Locale.new @CONF[:AT_EXIT] = [] @CONF[:COMMAND_ALIASES] = { # Symbol aliases :'$' => :show_source, :'@' => :whereami, } end
.init_error
# File 'lib/irb/init.rb', line 246
def IRB.init_error @CONF[:LC_MESSAGES].load("irb/error.rb") end
.inspect
# File 'lib/irb/init.rb', line 19
def @CONF.inspect array = [] for k, v in sort{|a1, a2| a1[0].id2name <=> a2[0].id2name} case k when :MAIN_CONTEXT, :__TMP__EHV__ array.push format("CONF[:%s]=...myself...", k.id2name) when :PROMPT s = v.collect{ |kk, vv| ss = vv.collect{|kkk, vvv| ":#{kkk.id2name}=>#{vvv.inspect}"} format(":%s=>{%s}", kk.id2name, ss.join(", ")) } array.push format("CONF[:%s]={%s}", k.id2name, s.join(", ")) else array.push format("CONF[:%s]=%s", k.id2name, v.inspect) end end array.join("\n") end
Inspector(inspect, init = nil)
Convenience method to create a new ::IRB::Inspector, using the given .inspect proc, and optional init proc and passes them to Inspector.new
irb(main):001:0> ins = IRB::Inspector(proc{ |v| "omg! #{v}" })
irb(main):001:0> IRB.CurrentContext.inspect_mode = ins # => omg! #<IRB::Inspector:0x007f46f7ba7d28>
irb(main):001:0> "what?" #=> omg! what?.irb(file = nil, *main)
Creates a new IRB session, see Irb.new.
The optional file argument is given to Context.new, along with the workspace created with the remaining arguments, see WorkSpace.new
# File 'lib/irb/ext/multi-irb.rb', line 182
def IRB.irb(file = nil, *main) # :nodoc: workspace = WorkSpace.new(*main) parent_thread = Thread.current Thread.start do begin irb = Irb.new(workspace, file) rescue print "Subirb can't start with context(self): ", workspace.main.inspect, "\n" print "return to main irb\n" Thread.pass Thread.main.wakeup Thread.exit end @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC] @JobManager.insert(irb) @JobManager.current_job = irb begin system_exit = false catch(:IRB_EXIT) do irb.eval_input end rescue SystemExit system_exit = true raise #fail ensure unless system_exit @JobManager.delete(irb) if @JobManager.current_job == irb if parent_thread.alive? @JobManager.current_job = @JobManager.irb(parent_thread) parent_thread.run else @JobManager.current_job = @JobManager.main_irb @JobManager.main_thread.run end end end end end Thread.stop @JobManager.current_job = @JobManager.irb(Thread.current) end
.irb_abort(irb, exception = Abort)
Aborts then interrupts irb.
Will raise an ::IRB::Abort exception, or the given exception.
.irb_exit
Quits irb
# File 'lib/irb.rb', line 910
def irb_exit(*) # :nodoc: throw :IRB_EXIT, false end
.irbrc_files
# File 'lib/irb/init.rb', line 426
def IRB.irbrc_files prepare_irbrc_name_generators @irbrc_files end
JobManager
The current ::IRB::JobManager in the session
# File 'lib/irb/ext/multi-irb.rb', line 169
def IRB.JobManager # :nodoc: @JobManager end
.load_modules
loading modules
# File 'lib/irb/init.rb', line 466
def IRB.load_modules for m in @CONF[:LOAD_MODULES] begin require m rescue LoadError => err warn "#{err.class}: #{err}", uplevel: 0 end end end
.parse_opts(argv: ::ARGV)
option analyzing
# File 'lib/irb/init.rb', line 251
def IRB.parse_opts(argv: ::ARGV) load_path = [] while opt = argv.shift case opt when "-f" @CONF[:RC] = false when "-d" $DEBUG = true $VERBOSE = true when "-w" Warning[:deprecated] = $VERBOSE = true when /^-W(.+)?/ opt = $1 || argv.shift case opt when "0" $VERBOSE = nil when "1" $VERBOSE = false else Warning[:deprecated] = $VERBOSE = true end when /^-r(.+)?/ opt = $1 || argv.shift @CONF[:LOAD_MODULES].push opt if opt when /^-I(.+)?/ opt = $1 || argv.shift load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt when '-U' set_encoding("UTF-8", "UTF-8") when /^-E(.+)?/, /^--encoding(?:=(.+))?/ opt = $1 || argv.shift set_encoding(*opt.split(':', 2)) when "--inspect" if /^-/ !~ argv.first @CONF[:INSPECT_MODE] = argv.shift else @CONF[:INSPECT_MODE] = true end when "--noinspect" @CONF[:INSPECT_MODE] = false when "--no-pager" @CONF[:USE_PAGER] = false when "--singleline", "--readline", "--legacy" @CONF[:USE_SINGLELINE] = true when "--nosingleline", "--noreadline" @CONF[:USE_SINGLELINE] = false when "--multiline", "--reidline" if opt == "--reidline" warn <<~MSG.strip --reidline is deprecated, please use --multiline instead. MSG end @CONF[:USE_MULTILINE] = true when "--nomultiline", "--noreidline" if opt == "--noreidline" warn <<~MSG.strip --noreidline is deprecated, please use --nomultiline instead. MSG end @CONF[:USE_MULTILINE] = false when /^--extra-doc-dir(?:=(.+))?/ opt = $1 || argv.shift @CONF[:EXTRA_DOC_DIRS] << opt when "--echo" @CONF[:ECHO] = true when "--noecho" @CONF[:ECHO] = false when "--echo-on-assignment" @CONF[:ECHO_ON_ASSIGNMENT] = true when "--noecho-on-assignment" @CONF[:ECHO_ON_ASSIGNMENT] = false when "--truncate-echo-on-assignment" @CONF[:ECHO_ON_ASSIGNMENT] = :truncate when "--verbose" @CONF[:VERBOSE] = true when "--noverbose" @CONF[:VERBOSE] = false when "--colorize" @CONF[:USE_COLORIZE] = true when "--nocolorize" @CONF[:USE_COLORIZE] = false when "--autocomplete" @CONF[:USE_AUTOCOMPLETE] = true when "--noautocomplete" @CONF[:USE_AUTOCOMPLETE] = false when "--regexp-completor" @CONF[:COMPLETOR] = :regexp when "--type-completor" @CONF[:COMPLETOR] = :type when /^--prompt-mode(?:=(.+))?/, /^--prompt(?:=(.+))?/ opt = $1 || argv.shift prompt_mode = opt.upcase.tr("-", "_").intern @CONF[:PROMPT_MODE] = prompt_mode when "--noprompt" @CONF[:PROMPT_MODE] = :NULL when "--script" noscript = false when "--noscript" noscript = true when "--inf-ruby-mode" @CONF[:PROMPT_MODE] = :INF_RUBY when "--sample-book-mode", "--simple-prompt" @CONF[:PROMPT_MODE] = :SIMPLE when "--tracer" @CONF[:USE_TRACER] = true when /^--back-trace-limit(?:=(.+))?/ @CONF[:BACK_TRACE_LIMIT] = ($1 || argv.shift).to_i when /^--context-mode(?:=(.+))?/ @CONF[:CONTEXT_MODE] = ($1 || argv.shift).to_i when "--single-irb" @CONF[:SINGLE_IRB] = true when "-v", "--version" print IRB.version, "\n" exit 0 when "-h", "--help" require_relative "help" IRB.print_usage exit 0 when "--" if !noscript && (opt = argv.shift) @CONF[:SCRIPT] = opt $0 = opt end break when /^-./ fail UnrecognizedSwitch, opt else if noscript argv.unshift(opt) else @CONF[:SCRIPT] = opt $0 = opt end break end end load_path.collect! do |path| /\A\.\// =~ path ? path : File.(path) end $LOAD_PATH.unshift(*load_path) end
.prepare_irbrc_name_generators (private)
# File 'lib/irb/init.rb', line 479
def prepare_irbrc_name_generators return if @existing_rc_name_generators @existing_rc_name_generators = [] @irbrc_files = [] rc_file_generators do |rcgen| irbrc = rcgen.call(IRBRC_EXT) if File.exist?(irbrc) @irbrc_files << irbrc @existing_rc_name_generators << rcgen end end generate_current_dir_irbrc_files.each do |irbrc| @irbrc_files << irbrc if File.exist?(irbrc) end @irbrc_files.uniq! end
.print_usage
Outputs the irb help message, see IRB@Command-Line+Options.
# File 'lib/irb/help.rb', line 9
def IRB.print_usage # :nodoc: lc = IRB.conf[:LC_MESSAGES] path = lc.find("irb/help-message") space_line = false File.open(path){|f| f.each_line do |l| if /^\s*$/ =~ l lc.puts l unless space_line space_line = true next end space_line = false l.sub!(/#.*$/, "") next if /^\s*$/ =~ l lc.puts l end } end
.raise_validation_error(msg)
# File 'lib/irb/init.rb', line 461
def IRB.raise_validation_error(msg) raise TypeError, msg, @irbrc_files end
.rc_file(ext)
# File 'lib/irb/init.rb', line 409
def IRB.rc_file(ext) prepare_irbrc_name_generators # When irbrc exist in default location if (rcgen = @existing_rc_name_generators.first) return rcgen.call(ext) end # When irbrc does not exist in default location rc_file_generators do |rcgen| return rcgen.call(ext) end # When HOME and XDG_CONFIG_HOME are not available nil end
.rc_file_generators (private)
enumerate possible rc-file base name generators
# File 'lib/irb/init.rb', line 498
def rc_file_generators if irbrc = ENV["IRBRC"] yield proc{|rc| rc == "rc" ? irbrc : irbrc+rc} end if xdg_config_home = ENV["XDG_CONFIG_HOME"] irb_home = File.join(xdg_config_home, "irb") if File.directory?(irb_home) yield proc{|rc| irb_home + "/irb#{rc}"} end end if home = ENV["HOME"] yield proc{|rc| home+"/.irb#{rc}"} if xdg_config_home.nil? || xdg_config_home.empty? yield proc{|rc| home+"/.config/irb/irb#{rc}"} end end end
.run_config
Run the config file
# File 'lib/irb/init.rb', line 397
def IRB.run_config if @CONF[:RC] irbrc_files.each do |rc| load rc rescue StandardError, ScriptError => e warn "Error loading RC file '#{rc}':\n#{e.(highlight: false)}" end end end
.set_encoding(extern, intern = nil, override: true) (private)
# File 'lib/irb/init.rb', line 522
def set_encoding(extern, intern = nil, override: true) verbose, $VERBOSE = $VERBOSE, nil Encoding.default_external = extern unless extern.nil? || extern.empty? Encoding.default_internal = intern unless intern.nil? || intern.empty? [$stdin, $stdout, $stderr].each do |io| io.set_encoding(extern, intern) end if override @CONF[:LC_MESSAGES].instance_variable_set(:@override_encoding, extern) else @CONF[:LC_MESSAGES].instance_variable_set(:@encoding, extern) end ensure $VERBOSE = verbose end
.set_measure_callback(type = nil, arg = nil, &block)
# File 'lib/irb/init.rb', line 199
def IRB.set_measure_callback(type = nil, arg = nil, &block) added = nil if type type_sym = type.upcase.to_sym if IRB.conf[:MEASURE_PROC][type_sym] added = [type_sym, IRB.conf[:MEASURE_PROC][type_sym], arg] end elsif IRB.conf[:MEASURE_PROC][:CUSTOM] added = [:CUSTOM, IRB.conf[:MEASURE_PROC][:CUSTOM], arg] elsif block_given? added = [:BLOCK, block, arg] found = IRB.conf[:MEASURE_CALLBACKS].find{ |m| m[0] == added[0] && m[2] == added[2] } if found found[1] = block return added else IRB.conf[:MEASURE_CALLBACKS] << added return added end else added = [:TIME, IRB.conf[:MEASURE_PROC][:TIME], arg] end if added IRB.conf[:MEASURE] = true found = IRB.conf[:MEASURE_CALLBACKS].find{ |m| m[0] == added[0] && m[2] == added[2] } if found # already added nil else IRB.conf[:MEASURE_CALLBACKS] << added if added added end else nil end end
.setup(ap_path, argv: ::ARGV)
initialize config
# File 'lib/irb/init.rb', line 50
def IRB.setup(ap_path, argv: ::ARGV) IRB.init_config(ap_path) IRB.init_error IRB.parse_opts(argv: argv) IRB.run_config IRB.validate_config IRB.load_modules unless @CONF[:PROMPT][@CONF[:PROMPT_MODE]] fail UndefinedPromptMode, @CONF[:PROMPT_MODE] end @INITIALIZED = true end
.start(ap_path = nil)
Initializes IRB and creates a new Irb.irb object at the TOPLEVEL_BINDING
.unset_measure_callback(type = nil)
.validate_config
# File 'lib/irb/init.rb', line 431
def IRB.validate_config conf[:IRB_NAME] = conf[:IRB_NAME].to_s irb_rc = conf[:IRB_RC] unless irb_rc.nil? || irb_rc.respond_to?(:call) raise_validation_error "IRB.conf[:IRB_RC] should be a callable object. Got #{irb_rc.inspect}." end back_trace_limit = conf[:BACK_TRACE_LIMIT] unless back_trace_limit.is_a?(Integer) raise_validation_error "IRB.conf[:BACK_TRACE_LIMIT] should be an integer. Got #{back_trace_limit.inspect}." end prompt = conf[:PROMPT] unless prompt.is_a?(Hash) msg = "IRB.conf[:PROMPT] should be a Hash. Got #{prompt.inspect}." if prompt.is_a?(Symbol) msg += " Did you mean to set `IRB.conf[:PROMPT_MODE]`?" end raise_validation_error msg end eval_history = conf[:EVAL_HISTORY] unless eval_history.nil? || eval_history.is_a?(Integer) raise_validation_error "IRB.conf[:EVAL_HISTORY] should be an integer. Got #{eval_history.inspect}." end end
.version
Returns the current version of IRB, including release version and last updated date.
# File 'lib/irb/init.rb', line 41
def IRB.version format("irb %s (%s)", @RELEASE_VERSION, @LAST_UPDATE_DATE) end