irb 1.14.0 → 1.14.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -2
- data/lib/irb/command/base.rb +10 -8
- data/lib/irb/command/debug.rb +8 -6
- data/lib/irb/command/help.rb +1 -1
- data/lib/irb/command/internal_helpers.rb +1 -1
- data/lib/irb/command/ls.rb +23 -11
- data/lib/irb/completion.rb +12 -5
- data/lib/irb/context.rb +60 -17
- data/lib/irb/debug/ui.rb +2 -4
- data/lib/irb/debug.rb +6 -10
- data/lib/irb/default_commands.rb +15 -7
- data/lib/irb/easter-egg.rb +10 -6
- data/lib/irb/history.rb +80 -55
- data/lib/irb/init.rb +1 -1
- data/lib/irb/input-method.rb +19 -18
- data/lib/irb/inspector.rb +31 -30
- data/lib/irb/lc/ja/help-message +4 -4
- data/lib/irb/nesting_parser.rb +196 -194
- data/lib/irb/pager.rb +10 -1
- data/lib/irb/ruby-lex.rb +84 -82
- data/lib/irb/ruby_logo.aa +75 -37
- data/lib/irb/source_finder.rb +3 -4
- data/lib/irb/version.rb +2 -2
- data/lib/irb/workspace.rb +13 -31
- data/lib/irb.rb +44 -67
- data/man/irb.1 +35 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 606da5c01c0630f572812c844da8f331fd487fa50060db8c95a61aef14660d68
|
4
|
+
data.tar.gz: 5d1749fea9672c734b9bdce740f6f43d90b2479e2a06de09d9604265317fab1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 478ceef6ddf60e4bf8ddf2f1586129eab9bcff9e40bb9af8662a1c7f46d7c406f7d896395d3459cbde5ac2a427b73e474327033647e6c742691c185a553a1d71
|
7
|
+
data.tar.gz: da1f92f1403c9fee631f7fc85f1bf60120db710bd171a98be1b428a22c4545fed4d4e4dd7692d90220520609047bd4fc6d00882da0bce7bf1a67e05dc41dd8e1
|
data/README.md
CHANGED
@@ -114,6 +114,7 @@ Help
|
|
114
114
|
help List all available commands. Use `help <command>` to get information about a specific command.
|
115
115
|
|
116
116
|
IRB
|
117
|
+
context Displays current configuration.
|
117
118
|
exit Exit the current irb session.
|
118
119
|
exit! Exit the current process.
|
119
120
|
irb_load Load a Ruby file.
|
@@ -121,6 +122,7 @@ IRB
|
|
121
122
|
source Loads a given file in the current session.
|
122
123
|
irb_info Show information about IRB.
|
123
124
|
history Shows the input history. `-g [query]` or `-G [query]` allows you to filter the output.
|
125
|
+
disable_irb Disable binding.irb.
|
124
126
|
|
125
127
|
Workspace
|
126
128
|
cwws Show the current workspace.
|
@@ -128,6 +130,7 @@ Workspace
|
|
128
130
|
workspaces Show workspaces.
|
129
131
|
pushws Push an object to the workspace stack.
|
130
132
|
popws Pop a workspace from the workspace stack.
|
133
|
+
cd Move into the given object or leave the current context.
|
131
134
|
|
132
135
|
Multi-irb (DEPRECATED)
|
133
136
|
irb Start a child IRB.
|
@@ -152,11 +155,14 @@ Misc
|
|
152
155
|
measure `measure` enables the mode to measure processing time. `measure :off` disables it.
|
153
156
|
|
154
157
|
Context
|
155
|
-
show_doc
|
158
|
+
show_doc Look up documentation with RI.
|
156
159
|
ls Show methods, constants, and variables.
|
157
|
-
show_source Show the source code of a given method or constant.
|
160
|
+
show_source Show the source code of a given method, class/module, or constant.
|
158
161
|
whereami Show the source code around binding.irb again.
|
159
162
|
|
163
|
+
Helper methods
|
164
|
+
conf Returns the current IRB context.
|
165
|
+
|
160
166
|
Aliases
|
161
167
|
$ Alias for `show_source`
|
162
168
|
@ Alias for `whereami`
|
@@ -164,6 +170,13 @@ Aliases
|
|
164
170
|
|
165
171
|
## Debugging with IRB
|
166
172
|
|
173
|
+
### Getting Started
|
174
|
+
|
175
|
+
- In `binding.irb`, use the `debug` command to start a `irb:rdbg` session with access to all `debug.gem` commands.
|
176
|
+
- Use `RUBY_DEBUG_IRB_CONSOLE=1` environment variable to make `debug.gem` use IRB as the debugging console.
|
177
|
+
|
178
|
+
### Details
|
179
|
+
|
167
180
|
Starting from version 1.8.0, IRB boasts a powerful integration with `debug.gem`, providing a debugging experience akin to `pry-byebug`.
|
168
181
|
|
169
182
|
After hitting a `binding.irb` breakpoint, you can activate the debugger with the `debug` command. Alternatively, if the `debug` method happens to already be defined in the current scope, you can call `irb_debug`.
|
@@ -348,6 +361,10 @@ irb(main):002> a.first. # Completes Integer methods
|
|
348
361
|
- `VISUAL`: Its value would be used to open files by the `edit` command.
|
349
362
|
- `EDITOR`: Its value would be used to open files by the `edit` command if `VISUAL` is unset.
|
350
363
|
- `IRBRC`: The file specified would be evaluated as IRB's rc-file.
|
364
|
+
- `XDG_CONFIG_HOME`: If it is set and `IRBRC` is unset, the file `$XDG_CONFIG_HOME/irb/irbrc` would be evaluated as IRB's rc-file.
|
365
|
+
- `RI_PAGER`: The command specified would be used as a pager.
|
366
|
+
- `PAGER`: The command specified would be used as a pager if `RI_PAGER` is unset.
|
367
|
+
- `IRB_LANG`, `LC_MESSAGES`, `LC_ALL`, `LANG`: The first of these that is set would be used as the locale value.
|
351
368
|
|
352
369
|
## Documentation
|
353
370
|
|
data/lib/irb/command/base.rb
CHANGED
@@ -10,8 +10,10 @@ module IRB
|
|
10
10
|
module Command
|
11
11
|
class CommandArgumentError < StandardError; end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
class << self
|
14
|
+
def extract_ruby_args(*args, **kwargs)
|
15
|
+
throw :EXTRACT_RUBY_ARGS, [args, kwargs]
|
16
|
+
end
|
15
17
|
end
|
16
18
|
|
17
19
|
class Base
|
@@ -31,6 +33,12 @@ module IRB
|
|
31
33
|
@help_message
|
32
34
|
end
|
33
35
|
|
36
|
+
def execute(irb_context, arg)
|
37
|
+
new(irb_context).execute(arg)
|
38
|
+
rescue CommandArgumentError => e
|
39
|
+
puts e.message
|
40
|
+
end
|
41
|
+
|
34
42
|
private
|
35
43
|
|
36
44
|
def highlight(text)
|
@@ -38,12 +46,6 @@ module IRB
|
|
38
46
|
end
|
39
47
|
end
|
40
48
|
|
41
|
-
def self.execute(irb_context, arg)
|
42
|
-
new(irb_context).execute(arg)
|
43
|
-
rescue CommandArgumentError => e
|
44
|
-
puts e.message
|
45
|
-
end
|
46
|
-
|
47
49
|
def initialize(irb_context)
|
48
50
|
@irb_context = irb_context
|
49
51
|
end
|
data/lib/irb/command/debug.rb
CHANGED
@@ -58,13 +58,15 @@ module IRB
|
|
58
58
|
end
|
59
59
|
|
60
60
|
class DebugCommand < Debug
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
class << self
|
62
|
+
def category
|
63
|
+
"Debugging"
|
64
|
+
end
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
def description
|
67
|
+
command_name = self.name.split("::").last.downcase
|
68
|
+
"Start the debugger of debug.gem and run its `#{command_name}` command."
|
69
|
+
end
|
68
70
|
end
|
69
71
|
end
|
70
72
|
end
|
data/lib/irb/command/help.rb
CHANGED
@@ -39,7 +39,7 @@ module IRB
|
|
39
39
|
|
40
40
|
help_cmds = commands_grouped_by_categories.delete("Help")
|
41
41
|
no_category_cmds = commands_grouped_by_categories.delete("No category")
|
42
|
-
aliases = irb_context.instance_variable_get(:@
|
42
|
+
aliases = irb_context.instance_variable_get(:@command_aliases).map do |alias_name, target|
|
43
43
|
{ display_name: alias_name, description: "Alias for `#{target}`" }
|
44
44
|
end
|
45
45
|
|
@@ -19,7 +19,7 @@ module IRB
|
|
19
19
|
# Use throw and catch to handle arg that includes `;`
|
20
20
|
# For example: "1, kw: (2; 3); 4" will be parsed to [[1], { kw: 3 }]
|
21
21
|
catch(:EXTRACT_RUBY_ARGS) do
|
22
|
-
@irb_context.workspace.binding.eval "IRB::Command.extract_ruby_args #{arg}"
|
22
|
+
@irb_context.workspace.binding.eval "::IRB::Command.extract_ruby_args #{arg}"
|
23
23
|
end || [[], {}]
|
24
24
|
end
|
25
25
|
end
|
data/lib/irb/command/ls.rb
CHANGED
@@ -11,7 +11,7 @@ module IRB
|
|
11
11
|
|
12
12
|
module Command
|
13
13
|
class Ls < Base
|
14
|
-
|
14
|
+
class EvaluationError < StandardError; end
|
15
15
|
|
16
16
|
category "Context"
|
17
17
|
description "Show methods, constants, and variables."
|
@@ -22,24 +22,35 @@ module IRB
|
|
22
22
|
-g [query] Filter the output with a query.
|
23
23
|
HELP_MESSAGE
|
24
24
|
|
25
|
+
def evaluate(code)
|
26
|
+
@irb_context.workspace.binding.eval(code)
|
27
|
+
rescue Exception => e
|
28
|
+
puts "#{e.class}: #{e.message}"
|
29
|
+
raise EvaluationError
|
30
|
+
end
|
31
|
+
|
25
32
|
def execute(arg)
|
26
33
|
if match = arg.match(/\A(?<target>.+\s|)(-g|-G)\s+(?<grep>.+)$/)
|
27
|
-
|
28
|
-
use_main = true
|
29
|
-
else
|
30
|
-
obj = @irb_context.workspace.binding.eval(match[:target])
|
31
|
-
end
|
34
|
+
target = match[:target]
|
32
35
|
grep = Regexp.new(match[:grep])
|
36
|
+
elsif match = arg.match(/\A((?<target>.+),|)\s*grep:(?<grep>.+)/)
|
37
|
+
# Legacy style `ls obj, grep: /regexp/`
|
38
|
+
# Evaluation order should be eval(target) then eval(grep)
|
39
|
+
target = match[:target] || ''
|
40
|
+
grep_regexp_code = match[:grep]
|
33
41
|
else
|
34
|
-
|
35
|
-
use_main = args.empty?
|
36
|
-
obj = args.first
|
37
|
-
grep = kwargs[:grep]
|
42
|
+
target = arg.strip
|
38
43
|
end
|
39
44
|
|
40
|
-
if
|
45
|
+
if target.empty?
|
41
46
|
obj = irb_context.workspace.main
|
42
47
|
locals = irb_context.workspace.binding.local_variables
|
48
|
+
else
|
49
|
+
obj = evaluate(target)
|
50
|
+
end
|
51
|
+
|
52
|
+
if grep_regexp_code
|
53
|
+
grep = evaluate(grep_regexp_code)
|
43
54
|
end
|
44
55
|
|
45
56
|
o = Output.new(grep: grep)
|
@@ -52,6 +63,7 @@ module IRB
|
|
52
63
|
o.dump("class variables", klass.class_variables)
|
53
64
|
o.dump("locals", locals) if locals
|
54
65
|
o.print_result
|
66
|
+
rescue EvaluationError
|
55
67
|
end
|
56
68
|
|
57
69
|
def dump_methods(o, klass, obj)
|
data/lib/irb/completion.rb
CHANGED
@@ -137,26 +137,33 @@ module IRB
|
|
137
137
|
end
|
138
138
|
|
139
139
|
class RegexpCompletor < BaseCompletor # :nodoc:
|
140
|
+
KERNEL_METHODS = ::Kernel.instance_method(:methods)
|
141
|
+
KERNEL_PRIVATE_METHODS = ::Kernel.instance_method(:private_methods)
|
142
|
+
KERNEL_INSTANCE_VARIABLES = ::Kernel.instance_method(:instance_variables)
|
143
|
+
OBJECT_CLASS_INSTANCE_METHOD = ::Object.instance_method(:class)
|
144
|
+
MODULE_CONSTANTS_INSTANCE_METHOD = ::Module.instance_method(:constants)
|
145
|
+
|
140
146
|
using Module.new {
|
141
147
|
refine ::Binding do
|
142
148
|
def eval_methods
|
143
|
-
|
149
|
+
KERNEL_METHODS.bind_call(receiver)
|
144
150
|
end
|
145
151
|
|
146
152
|
def eval_private_methods
|
147
|
-
|
153
|
+
KERNEL_PRIVATE_METHODS.bind_call(receiver)
|
148
154
|
end
|
149
155
|
|
150
156
|
def eval_instance_variables
|
151
|
-
|
157
|
+
KERNEL_INSTANCE_VARIABLES.bind_call(receiver)
|
152
158
|
end
|
153
159
|
|
154
160
|
def eval_global_variables
|
155
|
-
::Kernel.
|
161
|
+
::Kernel.global_variables
|
156
162
|
end
|
157
163
|
|
158
164
|
def eval_class_constants
|
159
|
-
|
165
|
+
klass = OBJECT_CLASS_INSTANCE_METHOD.bind_call(receiver)
|
166
|
+
MODULE_CONSTANTS_INSTANCE_METHOD.bind_call(klass)
|
160
167
|
end
|
161
168
|
end
|
162
169
|
}
|
data/lib/irb/context.rb
CHANGED
@@ -13,6 +13,10 @@ module IRB
|
|
13
13
|
# A class that wraps the current state of the irb session, including the
|
14
14
|
# configuration of IRB.conf.
|
15
15
|
class Context
|
16
|
+
KERNEL_PUBLIC_METHOD = ::Kernel.instance_method(:public_method)
|
17
|
+
KERNEL_METHOD = ::Kernel.instance_method(:method)
|
18
|
+
|
19
|
+
ASSIGN_OPERATORS_REGEXP = Regexp.union(%w[= += -= *= /= %= **= &= |= &&= ||= ^= <<= >>=])
|
16
20
|
# Creates a new IRB context.
|
17
21
|
#
|
18
22
|
# The optional +input_method+ argument:
|
@@ -148,8 +152,7 @@ module IRB
|
|
148
152
|
@newline_before_multiline_output = true
|
149
153
|
end
|
150
154
|
|
151
|
-
@
|
152
|
-
@command_aliases = @user_aliases.merge(KEYWORD_ALIASES)
|
155
|
+
@command_aliases = IRB.conf[:COMMAND_ALIASES].dup
|
153
156
|
end
|
154
157
|
|
155
158
|
private def term_interactive?
|
@@ -157,17 +160,6 @@ module IRB
|
|
157
160
|
STDIN.tty? && ENV['TERM'] != 'dumb'
|
158
161
|
end
|
159
162
|
|
160
|
-
# because all input will eventually be evaluated as Ruby code,
|
161
|
-
# command names that conflict with Ruby keywords need special workaround
|
162
|
-
# we can remove them once we implemented a better command system for IRB
|
163
|
-
KEYWORD_ALIASES = {
|
164
|
-
:break => :irb_break,
|
165
|
-
:catch => :irb_catch,
|
166
|
-
:next => :irb_next,
|
167
|
-
}.freeze
|
168
|
-
|
169
|
-
private_constant :KEYWORD_ALIASES
|
170
|
-
|
171
163
|
def use_tracer=(val)
|
172
164
|
require_relative "ext/tracer" if val
|
173
165
|
IRB.conf[:USE_TRACER] = val
|
@@ -187,11 +179,17 @@ module IRB
|
|
187
179
|
|
188
180
|
private def build_completor
|
189
181
|
completor_type = IRB.conf[:COMPLETOR]
|
182
|
+
|
183
|
+
# Gem repl_type_completor is added to bundled gems in Ruby 3.4.
|
184
|
+
# Use :type as default completor only in Ruby 3.4 or later.
|
185
|
+
verbose = !!completor_type
|
186
|
+
completor_type ||= RUBY_VERSION >= '3.4' ? :type : :regexp
|
187
|
+
|
190
188
|
case completor_type
|
191
189
|
when :regexp
|
192
190
|
return RegexpCompletor.new
|
193
191
|
when :type
|
194
|
-
completor = build_type_completor
|
192
|
+
completor = build_type_completor(verbose: verbose)
|
195
193
|
return completor if completor
|
196
194
|
else
|
197
195
|
warn "Invalid value for IRB.conf[:COMPLETOR]: #{completor_type}"
|
@@ -200,17 +198,17 @@ module IRB
|
|
200
198
|
RegexpCompletor.new
|
201
199
|
end
|
202
200
|
|
203
|
-
private def build_type_completor
|
201
|
+
private def build_type_completor(verbose:)
|
204
202
|
if RUBY_ENGINE == 'truffleruby'
|
205
203
|
# Avoid SyntaxError. truffleruby does not support endless method definition yet.
|
206
|
-
warn 'TypeCompletor is not supported on TruffleRuby yet'
|
204
|
+
warn 'TypeCompletor is not supported on TruffleRuby yet' if verbose
|
207
205
|
return
|
208
206
|
end
|
209
207
|
|
210
208
|
begin
|
211
209
|
require 'repl_type_completor'
|
212
210
|
rescue LoadError => e
|
213
|
-
warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}"
|
211
|
+
warn "TypeCompletor requires `gem repl_type_completor`: #{e.message}" if verbose
|
214
212
|
return
|
215
213
|
end
|
216
214
|
|
@@ -635,6 +633,46 @@ module IRB
|
|
635
633
|
result
|
636
634
|
end
|
637
635
|
|
636
|
+
def parse_command(code)
|
637
|
+
command_name, arg = code.strip.split(/\s+/, 2)
|
638
|
+
return unless code.lines.size == 1 && command_name
|
639
|
+
|
640
|
+
arg ||= ''
|
641
|
+
command = command_name.to_sym
|
642
|
+
# Command aliases are always command. example: $, @
|
643
|
+
if (alias_name = command_aliases[command])
|
644
|
+
return [alias_name, arg]
|
645
|
+
end
|
646
|
+
|
647
|
+
# Assignment-like expression is not a command
|
648
|
+
return if arg.start_with?(ASSIGN_OPERATORS_REGEXP) && !arg.start_with?(/==|=~/)
|
649
|
+
|
650
|
+
# Local variable have precedence over command
|
651
|
+
return if local_variables.include?(command)
|
652
|
+
|
653
|
+
# Check visibility
|
654
|
+
public_method = !!KERNEL_PUBLIC_METHOD.bind_call(main, command) rescue false
|
655
|
+
private_method = !public_method && !!KERNEL_METHOD.bind_call(main, command) rescue false
|
656
|
+
if Command.execute_as_command?(command, public_method: public_method, private_method: private_method)
|
657
|
+
[command, arg]
|
658
|
+
end
|
659
|
+
end
|
660
|
+
|
661
|
+
def colorize_input(input, complete:)
|
662
|
+
if IRB.conf[:USE_COLORIZE] && IRB::Color.colorable?
|
663
|
+
lvars = local_variables || []
|
664
|
+
if parse_command(input)
|
665
|
+
name, sep, arg = input.split(/(\s+)/, 2)
|
666
|
+
arg = IRB::Color.colorize_code(arg, complete: complete, local_variables: lvars)
|
667
|
+
"#{IRB::Color.colorize(name, [:BOLD])}\e[m#{sep}#{arg}"
|
668
|
+
else
|
669
|
+
IRB::Color.colorize_code(input, complete: complete, local_variables: lvars)
|
670
|
+
end
|
671
|
+
else
|
672
|
+
Reline::Unicode.escape_for_print(input)
|
673
|
+
end
|
674
|
+
end
|
675
|
+
|
638
676
|
def inspect_last_value # :nodoc:
|
639
677
|
@inspect_method.inspect_value(@last_value)
|
640
678
|
end
|
@@ -669,5 +707,10 @@ module IRB
|
|
669
707
|
def local_variables # :nodoc:
|
670
708
|
workspace.binding.local_variables
|
671
709
|
end
|
710
|
+
|
711
|
+
def safe_method_call_on_main(method_name)
|
712
|
+
main_object = main
|
713
|
+
Object === main_object ? main_object.__send__(method_name) : Object.instance_method(method_name).bind_call(main_object)
|
714
|
+
end
|
672
715
|
end
|
673
716
|
end
|
data/lib/irb/debug/ui.rb
CHANGED
@@ -45,9 +45,7 @@ module IRB
|
|
45
45
|
$stdout.puts line.chomp
|
46
46
|
}
|
47
47
|
when String
|
48
|
-
str
|
49
|
-
$stdout.puts line.chomp
|
50
|
-
}
|
48
|
+
Pager.page_content(str, retain_content: true)
|
51
49
|
when nil
|
52
50
|
$stdout.puts
|
53
51
|
end
|
@@ -56,7 +54,7 @@ module IRB
|
|
56
54
|
def readline _
|
57
55
|
setup_interrupt do
|
58
56
|
tc = DEBUGGER__::SESSION.instance_variable_get(:@tc)
|
59
|
-
cmd = @irb.debug_readline(tc.current_frame.
|
57
|
+
cmd = @irb.debug_readline(tc.current_frame.eval_binding || TOPLEVEL_BINDING)
|
60
58
|
|
61
59
|
case cmd
|
62
60
|
when nil # when user types C-d
|
data/lib/irb/debug.rb
CHANGED
@@ -57,22 +57,18 @@ module IRB
|
|
57
57
|
DEBUGGER__::ThreadClient.prepend(SkipPathHelperForIRB)
|
58
58
|
end
|
59
59
|
|
60
|
-
if
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
unless output.strip.empty?
|
65
|
-
cmd = output.split(/\s/, 2).first
|
60
|
+
if !DEBUGGER__::CONFIG[:no_hint] && irb.context.io.is_a?(RelineInputMethod)
|
61
|
+
Reline.output_modifier_proc = proc do |input, complete:|
|
62
|
+
unless input.strip.empty?
|
63
|
+
cmd = input.split(/\s/, 2).first
|
66
64
|
|
67
65
|
if !complete && DEBUGGER__.commands.key?(cmd)
|
68
|
-
|
66
|
+
input = input.sub(/\n$/, " # debug command\n")
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
72
|
-
|
70
|
+
irb.context.colorize_input(input, complete: complete)
|
73
71
|
end
|
74
|
-
|
75
|
-
@output_modifier_defined = true
|
76
72
|
end
|
77
73
|
|
78
74
|
true
|
data/lib/irb/default_commands.rb
CHANGED
@@ -181,9 +181,15 @@ module IRB
|
|
181
181
|
[:edit, NO_OVERRIDE]
|
182
182
|
)
|
183
183
|
|
184
|
-
_register_with_aliases(:irb_break, Command::Break
|
185
|
-
|
186
|
-
|
184
|
+
_register_with_aliases(:irb_break, Command::Break,
|
185
|
+
[:break, OVERRIDE_ALL]
|
186
|
+
)
|
187
|
+
_register_with_aliases(:irb_catch, Command::Catch,
|
188
|
+
[:catch, OVERRIDE_PRIVATE_ONLY]
|
189
|
+
)
|
190
|
+
_register_with_aliases(:irb_next, Command::Next,
|
191
|
+
[:next, OVERRIDE_ALL]
|
192
|
+
)
|
187
193
|
_register_with_aliases(:irb_delete, Command::Delete,
|
188
194
|
[:delete, NO_OVERRIDE]
|
189
195
|
)
|
@@ -259,10 +265,12 @@ module IRB
|
|
259
265
|
# Deprecated. Doesn't have any effect.
|
260
266
|
@EXTEND_COMMANDS = []
|
261
267
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
268
|
+
class << self
|
269
|
+
# Drepcated. Use Command.regiser instead.
|
270
|
+
def def_extend_command(cmd_name, cmd_class, _, *aliases)
|
271
|
+
Command._register_with_aliases(cmd_name, cmd_class, *aliases)
|
272
|
+
Command.class_variable_set(:@@command_override_policies, nil)
|
273
|
+
end
|
266
274
|
end
|
267
275
|
end
|
268
276
|
end
|
data/lib/irb/easter-egg.rb
CHANGED
@@ -100,19 +100,21 @@ module IRB
|
|
100
100
|
|
101
101
|
private def easter_egg_logo(type)
|
102
102
|
@easter_egg_logos ||= File.read(File.join(__dir__, 'ruby_logo.aa'), encoding: 'UTF-8:UTF-8')
|
103
|
-
.split(/TYPE: ([A-
|
103
|
+
.split(/TYPE: ([A-Z_]+)\n/)[1..]
|
104
104
|
.each_slice(2)
|
105
105
|
.to_h
|
106
106
|
@easter_egg_logos[type.to_s.upcase]
|
107
107
|
end
|
108
108
|
|
109
109
|
private def easter_egg(type = nil)
|
110
|
+
print "\e[?1049h"
|
110
111
|
type ||= [:logo, :dancing].sample
|
111
112
|
case type
|
112
113
|
when :logo
|
113
|
-
|
114
|
-
|
115
|
-
io.write easter_egg_logo(
|
114
|
+
Pager.page do |io|
|
115
|
+
logo_type = STDOUT.external_encoding == Encoding::UTF_8 ? :unicode_large : :ascii_large
|
116
|
+
io.write easter_egg_logo(logo_type)
|
117
|
+
STDIN.raw { STDIN.getc } if io == STDOUT
|
116
118
|
end
|
117
119
|
when :dancing
|
118
120
|
STDOUT.cooked do
|
@@ -123,7 +125,7 @@ module IRB
|
|
123
125
|
canvas = Canvas.new(Reline.get_screen_size)
|
124
126
|
end
|
125
127
|
ruby_model = RubyModel.new
|
126
|
-
print "\e[?
|
128
|
+
print "\e[?25l" # hide cursor
|
127
129
|
0.step do |i| # TODO (0..).each needs Ruby 2.6 or later
|
128
130
|
buff = canvas.draw do
|
129
131
|
ruby_model.render_frame(i) do |p1, p2|
|
@@ -137,10 +139,12 @@ module IRB
|
|
137
139
|
end
|
138
140
|
rescue Interrupt
|
139
141
|
ensure
|
140
|
-
print "\e[
|
142
|
+
print "\e[?25h" # show cursor
|
141
143
|
trap("SIGINT", prev_trap)
|
142
144
|
end
|
143
145
|
end
|
146
|
+
ensure
|
147
|
+
print "\e[0m\e[?1049l"
|
144
148
|
end
|
145
149
|
end
|
146
150
|
end
|